ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [HackCTF] BOF_PIE Write-up
    표튜터와 함께하는 Pwnable/HackCTF Write-up 2019. 4. 21. 19:39


    이번 문제는 BOF_PIE이다.

    포트번호를 보니 새로나온 문제인 것 같다.

    제목이 PIE인 것보니 Mitigation으로 PIE가 걸려있을 것 같다.



    역시나 PIE가 걸려있었고 NX도 걸려있었다.

    NX의 경우 heap, stack, data영역에 실행권한이 없는 것이고

    PIE의 경우 코드영역을 포함한 모든 영역이 랜덤하게 매핑된다.

    하지만 PIE는 Base주소만 달라지기 때문에 우리는 offset을

    이용하면 이 문제를 해결할 수 있을 것이다.



    바이너리를 실행시켜 보았다.

    "j0n9hyun을 아느냐"는 문자열이 출력되었고 j0n9hyun의 주소가

    출력되었다. 다음으로는 사용자로 부터 입력을 받았고 나는 "abcdefg"

    입력하였다. 그러자 "Nah..."라는 문자열이 출력되었다.



    당연히 함수로 예측되는 j0n9hyun을 이용해서 문제를 풀어야겠다는 생각이

    들었고 우리가 입력할 수있는 부분을 이용해서 BOF를 하면 될 것이라는

    생각이 들었다. 그래도 일단은 IDA를 이용해서 코드를 보도록 하자!




    < main >

    main은 신경쓸 것이 없었다. 그저 welcome함수를 호출하고 있고

    우리가 아까 본 "Nah..." 문자열이 있었다.




    < welcome >

    welcome함수를 보자. 이 부분을 보면 아까 우리가 봤던 j0n9hyun의

    주소를 출력하는 부분이 있는데 j0n9hyun의 주소가 아니라 welcome의 주소였다.

    어쨌든 문제를 푸는데 있어서 힌트라는 것은 변함이 없었다.





    분명히 어딘가에 j0n9hyun에 대한 정보가 있을 것이라고 생각했고

    나는 IDA를 이용해서 발견했다. 동시에 welcome함수와

    j0n9hyun함수의 offset도 확인할 수 있었다.



    < j0n9hyun >

    해당 함수는 "ha-wi"라는 문자열을 출력하였고  fopen을 이용해서

    flag를 보여주었다. 여기까지 진행했더니 Payload를 어떻게 구성해야할지 떠올랐다.


    Payload구성은 다음과 같다. 문자열로 출력해주는 welcome함수의 주소를

    이용해야하는데 PIE가 걸려있기 때문에 그대로 이용하게 되면 주소가 랜덤하므로

    성공할 수 없다. 그러므로 우리는 base주소를 알아야 한다. base주소를

    먼저 구해야하므로 출력되는 welcome함수 주소에서 우리가 바로 위에서 알아낸

    welcome offset을 빼주어서 base주소를 구한다. 그 다음 그 base주소에 j0n9hyun함수의

    offset을 더하게되면 정확한 j0n9hyun을 호출할 수 있을 것이다. 아 물론 BOF를 이용하여

    ret를 덮을 수 있는 위치는 파악해야 한다. 그럼 이제 필요한 것들을 구해보자.




    ret까지 22개의 dummy를 이용한다면 접근할 수 있다.

    위에서 필요한 것들을 이미 다 구했으므로 바로 payload를 작성하였다.




    다음과 같이 Payload를 구성한 뒤 공격을 진행하였다.

    ret를 우리가 구한 j0n9hyun의 함수주소로 덮어주면 된다.




    생각한대로 FLAG가 넘어왔다~~


    반응형

    댓글

Designed by Tistory.