0. Introduce
대회 후에 이 문제가 Heap관련 문제라고해서 풀어봤습니다. 생각보다 쉽게풀려서 좋네요.
1. Binary
특이점은 NX가 꺼져있는 점이다. NX가 꺼져있다는것은 Heap 혹은 Stack영역에 쉘코드를 올리고 실행시켜 간단하게 쉘을 딸 수 있다는 말이된다.
바이너리는 간단한 메모 프로그램이였다. Leave message로 메모 후(malloc) Remove를 이용해 지운다(free). 혹은 Change message를 이용해 수정할 수 있다. View message에서는 메모를 볼 수 있다.
2. Vulnerability
먼저 가장 중요한 Heap Overflow이다. 'L'로 message를 생성할때 크기를 지정해서 생성하고 그 후 'C'로 수정 할때 크기를 지정해서 수정할 수 있는데 그 크기에 원래 message크기 보다 넘는 값을 넣을 수 있기 때문에 overflow가 발생한다.
또한 저번에 ezhp문제에서 봤던 커스텀 malloc과 커스텀 free가 존재한다. 그러므로 unsafe unlink를 이용해서 푸는 문제임을 직감적으로 알아챘다.
3. Exploit
푸는방법은 다음순서이다.
1) Heap메모리중 자유롭게 쓸 수 있는 포인터를 leak한다.
2) heap overflow를 이용해 unlink할 때 fd, bk포인터를 바꿔준다.
3) exit_got에 쉘코드가 써져있는 heap메모리주소를 넣는다.
leak 하는부분은 heap overflow가 발생하기때문에 매우 쉽게 가능하며 unlink도 어렵지 않게 할 수 있다.
여기서 주의해야할 것은 unlink가 될 때, exit_got주소와 동시에 heap메모리 +0x8이나 +0x10 위치에 값이 써진다는점이다.
다른 익스플로잇을 참고해보면 pop ret가젯을 써서 다른 주소로 이동하기도하던데 나는그냥 간단하게 'C'로 쉘코드를 한번더 덮어씌워주었다.
Full Exploit
(https://github.com/LYoungJoo/CTF-Write-Up/blob/master/2017_CodeGate_Prequals%20Write%20Up/messenger.py)
'해킹 > Write Up' 카테고리의 다른 글
Codegate 2017 prequals angrybird Write Up (0) | 2017.03.20 |
---|---|
Codegate 2017 prequals RamG-thunder Write Up (0) | 2017.03.11 |
XiomaraCTF 2017 Xor Tool Write Up (0) | 2017.02.27 |
XiomaraCTF 2017 mint Write Up (0) | 2017.02.27 |
XiomaraCTF 2017 pwn50 Write Up (0) | 2017.02.27 |