힌트를 봐보겠습니다.

80byte를 할당하였으나 fgets에서 79byte를 받음으로 buf overflow 버그가 먹히지 않네요.
printf를 보니 포맷 스트링 버그 (FSB)가 존재합니다.
이 버그를 이용해서 풀어야할 것 같습니다.
AAAA + %08x * n 을 통해 bleh와 printf의 간격이 어느정도인지 확인해보겠습니다.

4번을 써야 bleh의 내용을 볼 수 있네요.
그럼 AAAA를 입력 후 %08x를 3번 적은 후 bleh에 접근해서 %n으로 메모리 값을 써서 shell을 실행시키도록 해보겠습니다.
근데 여기서 알아야하는게 프로세스가 종료될때 이동하는 ret가 아닌, main이 실행되고 종료될때 사용되는 dtors를 이용해야 한다고 합니다.

dtors의 주소 0x08049594를 알아둡시다. 근데 실제 사용하는 것은 dotrs의 끝인 dtor_end 주소를 사용한다고 합니다. 4byte를 더 더해주어서 0x08049598을 알아두면 됩니다.
0x08049598 의 값을 EGG shell 주소인 0xbffffc90으로 바꿔주면 됩니다.
%n의 특징을 이용해야합니다.
paylod를 어떻게 작성해야하냐면...
(python -c 'print "AAAA" + "dtors_end 2byte 뒷주소" + "AAAA" + "dtors_end 2byte 앞주소" + "%8x" * 3 + "%(Shell code 뒷 4byte - 40)c" + "%n" + "%(Shell code 앞 4byte - Shell code 뒷 4byte)c" + "%n"';cat)|./attackme
이렇게 작성해야합니다.
결과로는!


FTZ가 끝이 났습니다.
'CTF 공부 > FTZ' 카테고리의 다른 글
[FTZ]level19 (0) | 2020.01.23 |
---|---|
[FTZ]level18 (0) | 2020.01.23 |
[FTZ]level17 (0) | 2020.01.23 |
[FTZ]level16 (0) | 2020.01.23 |
[FTZ]level15 (0) | 2020.01.23 |