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 |