0. introduce
Heap 공부를 하려고 heap문제중에 난이도가 쉬운편에 속하는 CTF문제를 찾다가 알게되었다.
처음에 이상한 함수를 보고 겁먹었는데 gdb로 뜯어보는게 제일 좋은것같다.
1. binary
하나도 안걸려있다!
1 to add a note.
2 to remove a note.
3 to change a note.
4 to print a note.
5 to quit.
이렇게 5개의 메뉴를 가지고 간단하게 note를 할 수 있는 프로그램이였다.
특이한점은 노트를 추가할때 사이즈만 등록해서 추가하고 내용을 추가하려면 change a note에서 내용을 추가해야 한다.
2. Vulnerability
add a note인데 sub_804858B함수를 확인해보면 커스텀 malloc함수인걸 알 수 있다.
이 함수에서는 입력받은 크기만큼 그냥 malloc해준다.
change a note를 보면 원하는 청크를 선택해서 원하는 사이즈만큼 데이터를 넣는다.
그러므로 Heap Overflow가 발생한다.
print a note이다. 청크내용을 출력한다.우리는 원하는 청크를 Heap Overflow로 마음대로 조작할 수 있으므로 여기서 Memory leak이 나는것을 알 수 있다.
3. Exploit
이 프로그램에서 사용하는 Malloc을 분석해보면 청크는
prev_size(4) + size(4) + fd(4) + bk(4) + data(?)
이런 형식으로 구성 되었다. 그리고 fd와 bk는 &size + 4, &size + 8이렇게 되었다.
좀 신기한점은 free하지 않아도 fd와 bk가 있다는 점이 신기했다.
그리고 sub_804858B를 보면 지금 malloc에 적용되어있는 fd, bk검증 구문이 없는것을 알 수 있고 이것은 fd, bk를 조작해서 원하는곳에 값을 쓸 수 있다는것을 말한다.
나는 다음과같이 exploit을 했다.
1. 힙 청크 3개를 선언. (size = 12)
2. 첫번째 청크를 overflow시켜서 두번째 청크의 fd를 leak함.
3. leak한 fd에 + 0xc를 해서 3번째 청크 데이터주소를 구함.
4. 다시 첫번째 청크를 overflow시켜서 두번째 청크의 fd, bk를 (leak_add+0xc), (exit_got+4)로 조작한다.
5. 2번째 청크를 지워서 unlink가 발생하도록 한다.
6. 3번 청크의 데이터 에다가 쉘코드를 써준다.
7. exit_got를 실행
이게 순서가 정말 중요하다.. 순서를 이상하게 했다가 오래걸렸다..
https://github.com/LYoungJoo/CTF-Write-Up/blob/master/2014_Plaid_ctfpwn%20Write%20Up/ezhp.py
Clear~
'해킹 > Write Up' 카테고리의 다른 글
Codegate 2017 prequals Babypwn Write Up (0) | 2017.02.16 |
---|---|
Hackcon Mini 2017 Pwnable WriteUp (0) | 2017.02.12 |
Codegate 2014 angry_doraemon (0) | 2017.01.28 |
HDcon luckyzzang write up (0) | 2017.01.27 |
3DS CTF 2016 not-the-same-200 Write Up (0) | 2017.01.27 |