0. Introduce
문제에는 여러가지 취약점이 있었는데, stack smashing detected가 뜨는걸보고 이부분을 gdb로 뜯어봤는데 데이터가 들어가는 부분부터 보면 주소값이 없어서 왜 버퍼오버플로우가나는데 근처에 주소값이 없는지생각하다가 다른곳을 삽질해서 시간을 조금 낭비했다.. 그냥 2더한값부터 본다면 바로 주소가보였는데.. 어쨋든 취약점 찾는부분 빼고 나머지는 luckyzzang과 거의 비슷했다.
1. Binary
1.Sword
2.Screwdriver
3.Red-bean bread
4.Throw mouse
5.Fist attack
6.Give up
처음 시작할 때 6가지 메뉴가 있으며 도라에몬의 체력을 다 깎으면 이기는 게임이다.
2.Vulnerability
5번을 선택하게되면 이 함수가 실행된다. 그리고 right-fist attack을 선택하면 0x08로 시작하지 않는 4바이트 주소값을 Call한다.
하지만 코드영역을 사용하지 못하면 결국 라이브러리를 사용해야하는데 leak이 나지않아 사용할 수 없다.
4번을 선택하면 실행되는 함수이다. read에서 버퍼오버플로우 취약점이 나며 'You Choose %s'에서 memory leak을 할 수 있다.
3. Exploit
해야하는건 다음과같다.
1. canary leak
: canary를 leak하는건 printf("You Choose '%s' !\n", &buf);를 이용하면 할 수 있다. gdb로 디버깅을해서 카나리의 위치를 찾아보면 buf + 10에 위치하는것을 알 수 있다. 하지만 카나리의 값의 마지막 값이 \x00이라서 카나리 leak이 되지않았다. 그래서 buf + 11부터 leak을 해오고 leak해온 값에다가 \x00을 붙여주었다.
2. system address leak (libc leak)
: write(0x4, write_got, 0x4) 이런식으로 rop chain을 구성해서 write_got를 leak해온뒤 libc로 system주소값을 구해줬다.
3. write cmd('nc -lvp 5555 -e /bin/sh\x00') on writable address
: read(0x4, writable_add, 0x4) 이런식으로 rop chain을 구성해서 cmd를 send하면 writable address에 cmd를 입력할 수 있다.
4. system + dummy(4) + cmd
: 셋팅하고 leak해온 값들로 최종 Exploit을 하면된다.
5. nc ip port
: 쉘 획득.
4. NOTE
문제를 풀고 다른 write-up들을 구경하다가 pwntool의 ROP()와 ELF()를 이용하여 쉽게 푸는것을 보았다. 앞으로 그런방법을 연구해 보아야 겠다.
(영어를 잘 못하지만 깔끔하게 익스한것 같아서 기쁘다)
'해킹 > Write Up' 카테고리의 다른 글
Hackcon Mini 2017 Pwnable WriteUp (0) | 2017.02.12 |
---|---|
Plaid CTF 2014 ezhp Write Up (0) | 2017.01.29 |
HDcon luckyzzang write up (0) | 2017.01.27 |
3DS CTF 2016 not-the-same-200 Write Up (0) | 2017.01.27 |
3DS CTF 2016 get-started-100 Write Up (0) | 2017.01.27 |