해킹/Write Up

Codegate 2017 prequals messenger Write Up

NextLine 2017. 3. 11. 12:24

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)