ABOUT ME

-

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

    이번 문제는 Offset이다~


    지금까지의 문제와는 다르게 처음으로 Mitigation이 걸려있다.

    RELRO가 FULL이기 때문에 write권한이 없어서 Got Overwrite를

    진행할 수 없고 PIE와 NX가 걸려있기 때문에 Code영역을 포함한

    모든영역이 랜덤하게 매핑되며 data, stack, heap에 실행권한이 없다.



    코드를 보도록 하자~

    코드를 보면 gets함수를 이용해서 s 버퍼에 값을 받고

    그 s 버퍼를 인자로 select_func 함수를 호출한다.



    select_func 함수를 보도록 하자. v3를 보게되면

    기본적으로 two함수의 주소를 받고 있다. 만약 s 버퍼에

    입력한 값이 "one"이 된다면 v3의 값은 one 함수의 주소가 된다.

    그러므로 우리는 이 호출되는 v3의 주소를 우리가 원하는 주소로 대체해주면된다. 


    어셈블리어 코드로 보기전에 해당 바이너리에 사용된 함수를 보았다.

    print_flag라는 의심스러운 함수가 보였다.




    해당 함수를 보니 역시나 flag에 관련된 정보를 읽어오고 있었다.

    그러므로 해당 주소 print_flag 함수 주소를 마지막에 호출되는 v3주소 대신 넘겨준다면.

    그렇게 되면 print_flag가 실행되면서 flag를 볼 수 있을 것이다.

    그렇다면 select_func함수에서 마지막에 호출되는 부분을 찾아보도록 하자. 




    select_func함수에서 call되는 주소값은 eax인데

    바로 v3 일 것이다. 그러므로 v3의 주소가 0x56555600이므로

    우리가 저 위치를 찾아서 우리가 원하는 값으로 덮으면 된다.

    그림은 10개의 "a"를 입력한 값인데 해당 위치 직전까지 30개의 dummy가

    필요하다는 것을 알 수 있었다. 그러므로 우리는 30개의 dummy 다음에

    print_flag의 offset을 덮어주면 flag를 보게 될 것이다.

    (PIE는 base주소만 바뀌기 때문에 offset값만 맞춰주면 된다!!)


    그래서 이 문제의 제목이 offset인가보다~


    위의 내용을 토대로 Payload를 구성해보았다.




    해당 Payload를 진행하였더니 FLAG를 볼 수 있었다.

    반응형

    댓글

Designed by Tistory.