티스토리 뷰
처음 바이너리를 실행하고 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 |