티스토리 뷰

CTF

Christmas CTF 2016 - Nature Dream

Eyebrowmoon 2016. 12. 25. 02:34

처음 바이너리를 실행하고 10개의 메뉴에 당황했지만 풀어보니 나름 재밌었던 문제.


취약점은 위의 그림과 같이 사실 물고기를 17마리까지 구매할 수 있다는 점이다. 사실 나는 실행횟수 100회 제한 때문에 3400원 못 벌 줄 알고 이 부분 발견하고도 꽤 고민했는데 혹시 해서 실험해보니 너무 쉽게 가져서 좀 당황했다.


17번째로 구매한 물고기의 포인터는 자신이 가지고 있는 액수에 해당되는 변수를 덮어쓰는데, 이를 통해 heap memory leak을 낼 수 있음과 동시에 물고기 포인터들을 덮어쓸 수 있는 어항 이름 변경 routine으로 진입할 수 있게 된다.


이를 이용하기 위해 처음 바이너리를 시작하면 꽤 긴 값을 입력받을 수 있는 name buffer에 fake fish를 주소가 8 차이나도록 두 마리 겹쳐서 만든다. 두 마리를 겹치는 이유는 두 번째 fish의 ascii를 수정함으로써 첫 번째 fish의 name pointer를 임의의 덮어쓰고싶은 주소로 변경하기 위함이다. Name의 초기값은 puts의 GOT로 설정해두면 어항의 정보를 읽으면서 libc의 주소를 알아낼 수 있다.


결국 free_hook의 내용을 system 주소로 덮은 후 0번을 눌러 탈출하면 처음에 입력한 name buffer를 free시키는데, name buffer를 아래와 같이 구성함으로써 위의 시나리오를 그대로 사용하면서 쉘을 띄울 수 있다.


[/bin/sh\x00] + [padding] + [fake fish 1]

      [fake fish 2] 


아래는 문제 바이너리와 exploit..

https://github.com/Eyebrowmoon/ctf/tree/master/christmas2016/fish2

'CTF' 카테고리의 다른 글

SECUINSIDE 2017 - babyheap  (0) 2017.07.02
DEFCON 2017 Quals - faggin  (1) 2017.07.02
Christmas CTF 2016 - House of Daehee  (0) 2016.12.25
Christmas CTF 2016 - Who is solo  (2) 2016.12.25
HITCON 2016 - Secret Holder  (0) 2016.10.10
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함