본문으로 바로가기

Codegate 2017 petshop write up

category 해킹/Write Up 2017. 5. 7. 17:04

0. introduce

대회때는 peda-gdb로 삽질해야되서 힙구조 확인도 너무힘들고 C++이 리버싱이 힘들어서 건들지 못한문제입니다. 다시 풀어보니까 정말 쉽네요.. 그때도 real에 시간버리지말고 여기다가 올인했으면 풀 수 있었을듯 싶습니다. 공격법은 이문제가 더 쉽지만 공격 원리는 oreo와 비슷했습니다. heap문제도 계속 풀어보니까 유형이 조금 익는것 같습니다.


1. Binary

Canary에 NX가 걸려있다. RELRO를 걸지 않은걸 보면 got overwrite일 확률이 높다.


1. buy pet

- cat / dog / goldfish / horse 이 4마리를 구매할 수 있다.

- 고양이를 구매하면 힙에 72바이트를 할당하고 값이 들어간다.

- [ chunk : 0x4027d0 / chunk+8 : CAT / chunk+18 : Meow / chunk+28 : Milk / chunk+40 : person_name_pointer ]

- 다른 동물들도 미리 정해져있는 이름과 울음소리와 먹이가 자동으로 힙에 할당된다.

- 최대 2마리를 구매할 수 있다.

2. sell pet

- 할당된 모든 동물 chunk를 free한다.

3. sound pet

- 각 동물에 울음소리가 출력된다.

4. set pet

- 동물을 설정할 수 있다.

- name / sound / feed

5. list pet

- 동물들의 정보를 모두 출력한다. ( 사람 이름까지 )

6. set your name

- 사람의 이름을 등록한다.

- 16바이트가 넘어가지 않는다면 동물정보 청크에 할당되며  16바이트가 넘어가면 다른 힙청크에 생성된다.

7. exit

- exit(-1);


2. Vulnerability

- 동물을 설정할 때, 길이검사를 하지 않으므로 heap overflow가 발생한다.

- heap overflow로 person_name_pointer를 바꿀 수 있고, [5. list pet]으로 원하는 모든 위치를 leak할 수 있다.

- 또한 person_name_pointer를 변경하고 [6. set your name]을 통해 모든 위치를 overwrite할 수 있다.


3. Exploit

got두개를 leak해서 libc버전을 알아내고, set your name 으로 exit의 got를 one_shot 가젯 주소로 덮어씌워주면 쉘을 획득할 수 있다.

(로컬환경이기 때문에 libc버전을 알아내는 과정은 생략했다.)


Full Exploit Code

(https://github.com/LYoungJoo/CTF-Write-Up/blob/master/2017_Codegate%20Write%20Up/petshopex.py)

'해킹 > Write Up' 카테고리의 다른 글

Pwnabletw silver bullet Write Up  (0) 2017.05.13
Pwnabletw hacknote Write Up  (0) 2017.05.12
Hacklu 2014 oreo Write Up  (0) 2017.05.03
DEFCONCTF Qualifier 2017 Write Up  (0) 2017.05.02
Pwnabletw orw Write Up  (0) 2017.04.05