ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [HackCTF] Basic_FSB Write-up
    표튜터와 함께하는 Pwnable/HackCTF Write-up 2019. 6. 11. 21:04

    포너블 공부를 처음 시작할 때 가장 어렵게 느꼈던 FSB다.

    나중에 공부할려고 안풀고 몰아놨는데 이제 해야할 때 인 것 같다.

    FSB란 Format String Bug의 약자이다. 이 문제는 32bit Binary에서 진행된다.






    고맙게도 아무런 Mitigation도 걸려있지 않다. ASLR은 아직 모르겠다.(아마 걸려있을 것 같다)

    Partial RELRO이기 때문에 우리는 Got Overwirte는 할 수 있다.





    우선 문제를 실행시켜보았다.

    단순히 사용자로부터 입력을 받고 입력받은 값을 출력해주는 것 같다.







    이번에는 IDA를 이용해서 코드를 보도록 하겠다.

    < main >

    main 함수에는 특별해보이는 것은 없고 누가봐도 

    굉장히 수상한 이름의 vuln함수를 호출하고 있었다.






    < vuln >

    역시나 이 함수에서 바로 FSB가 터지고 있다. 입력을 받고나서

    snprintf 함수를 이용하여 s버퍼의 내용을 format 버퍼에 저장하고 있다.

    또한 printf에서도 포맷스트링 없이 변수를 그대로 출력하고 있었다.

    snprintf, printf 함수에서 FSB가 터질 것이다. 

    그러므로 둘 중에 하나를 골라서 공격을 시도하면 된다.

    나는 snprintf 함수를 이용해서 공격을 했다. 원리는 다음과 같다.

    snprintf 함수에서 FSB를 일으켜서 printf 함수의 Got를 Overwrite했다.






    < flag >

    이 문제에서는 oneshot gadget을 주어줬다. 그러므로

    flag 함수로 printf@got를 Overwrite하면 FLAG를 볼 수 있을 것이다.






    다시 문제로 돌아와서 기본적으로 포맷스트링 문자열을

    입력해서 어떠한 결과가 나오는지 알아보자.





    dummy 다음에 %x %x %x %x %x를 입력해보았다.

    그러자 다음과 같이 출력이 된 것을 볼 수 있었다.

    2번째 포맷스트링부터 우리가 입력한 값 "aaaa"가 들어간 것을

    확인할 수 있었다. 그러므로 우리는 2번째 부분에서 %n을 이용할 것이고

    이전에 입력값을 이용해서 그 크기를 맞추어주면 될 것이다. 

    즉, printf@got 주소를 입력해주고 %x 앞에 flag주소만큼의

    크기를 채워주고 %n을 이용해서 입력을 해주면 된다. 





    * 요 약 *

    1. 간단하게 말해서 자신이 입력한 dummy값이 나오는 위치를 찾자.

    -> 이 위치는 우리가 최종적으로 %n을 사용하게될 위치이다.

    (덮어쓸 주소를 %n을 이용해서 만들어주는 것이다.)


    2. 덮임을 당할 주소를 넣어줘야하는데 그 위치는 입력값에 달려있다.

    위의 문제에서 보면 우리가 입력한 aaaa는 0x62626262라는 주소가되며

    그 주소에 %n으로 만들어진 값이 채워지는 것이다. 그러므로 printf@got를

    입력하게되면 이 주소에 %n으로 만들어진 값이 덮어씌워지는 것이다.!!





    < Payload >

    %n을 이용해서 flag 주소값을 맞춰주려고 하는데 앞에 이미 printf@got가

    입력되었으므로 4byte를 빼주어야한다. 그렇기 때문에 4를 뺀 값을 넣어준 것이다.







    다음과 같이 Payload를 진행하게되면~~

    짜잔~ FLAG를 볼 수 있었다!!


    * Thanks to Morae *


    댓글 0

Designed by Tistory.