ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [HackCTF] Yes or no Write-up
    표튜터와 함께하는 Pwnable/HackCTF Write-up 2019. 5. 26. 15:38

    이번 문제는 새로나온 문제인 Yes or no 이다.

    어려운 문제는 아니지만 다른 150점짜리

     문제들 중에는 그래도 난이도가 있는 것 같다.

    (그게 아니라면 내가 어렵게 푼 것일지도.. ㅎㅎ)




    해당 문제는 NX가 걸려있고 Partial RELRO이다.

    따라서 Stack, Heap, .data영역에 실행권한이 없으며

    Got Overwrite가 가능하다!!




    문제를 실행시켜보니 사용자로부터 입력을 받고 있다.

    내가 입력한 값이 어떠한 조건을 만족하지 못해서인지

    "Sorry. You can't come with us"라는 출력문을 보여주었다.

    ( 문제 이름도 그렇고 Show me the money인가??.. )





    해당 문제를 IDA로 보기로 하였다.

    fgets() 함수로 입력을 받고 문자열을 atoi를 이용해서 숫자로 바꾸어주었다.

    음.. 코드를 보았을 때 무언가 더 진행하기 위해서는 gets() 함수를

    실행시켜서 한번 더 입력을 진행해야만 할 것 같다.  gets()함수는 

    길이 제한이 없기 때문에 유용하게 쓰일 것 같기 때문이다.

     그 아래에는 무언가 힌트로 추정되는 문자열도 보였다. do_system_1094 ??

    음.. 아직까지는 무슨의미인지는 모르겠지만 일단 알아두겠다.






    이 문제에서 사용된 함수들을 보게되면 

    puts과 gets가 보인다. 이 함수들은 원하는 메모리 주소를 leak

    하거나 메모리에 무언가를 쓸 때 유용하게 사용할 수 있을 것 같다.





    이제 문제를 풀기위해 우선적으로 gets() 함수를 실행하게되는

    조건에 대한 입력값을 찾아보도록하자!!





    바로 이 부분의 조건을 만족시켜야한다.






    GDB를 이용해서 디버깅을 해보자!!

    if 문과 관련된 부분에 breakpoint를 걸어두었다.

    현재 내가 입력한 값은 [rbp-0x8]에 들어가 있다.

    내가 입력한 값과 eax에 들어가 있는 0x960000이 같아야 만족한다.



    다를 경우 gets()가 있는 곳이 아닌 곳으로 점프하기 때문이다.



    그럼 0x960000 -> 10진수로 9830400이므로 우리는

    9830400을 입력하면 gets()로 길이 제한없는 입력을 할 수 있게된다.




    짜잔!



    이제 다음으로는 어떻게 진행할지 딱 느낌이 왔다!!

    puts 함수와 이용해서 system함수의 주소를 leak한 다음

    gets 함수를 이용해서 고정 주소 영역에  "/bin/sh"을

     저장한 뒤 실행시켜주면 될 것이다.





    하지만!! 내눈엔 gadget이 안보였다. 그래서 나는 RTC를 사용했다.

    다 풀고나서 뒤늦게 안 것이지만 ROP Gadget이라는 Tool을 이용하면

    쉽게 필요한 Gadget을 찾을 수 있다고 한다.. 

    ( 다음에 문제 풀땐 그걸 써야지ㅎㅎ )





    CSU Gadget 소를 구하고 난뒤~




    ret 직전까지 어느 정도의 dummy가 필요한지 확인해보았다.

    0x12 + sfp(8)이므로 총 26개의 dummy가 필요하다.




    필요한 것들은 다 구했으니 이제 Payload를 구성해보도록 하자!!




    < Payload >

    ROP Gadget을 사용하면 굳이 RTC를 사용할 필요가 없다.

    ( 나는 Gadget을 못찾아서 사용했다.. ㅎㅎㅎ그래서 더 길어짐.. )

    원리는 위에서 설명한 것과 두 방법은 같다. 그러므로 그대로 진행하면된다.



    이 문제에서 하나 중요한 것은 주소를 leak하게 되면 8byte가 아니라

    6byte가 넘어오므로 Unpack이 안된다. 그러므로 6byte를 우선 recv한 뒤

    두 바이트 Null 값을 붙여주고 Unpack을 진행해주면 된다.




    위의 Payload대로 진행하게되면~~

    Flag를 볼 수 있게 된다~~ 흠.. 결론적으로 힌트로

    보여진 문자열은 왜 주어진지는 밝혀내지 못했다. 

    혹시나 저 힌트를 이용한 문제풀이가 있다면 댓글 부탁드립니다 ^^

    반응형

    '표튜터와 함께하는 Pwnable > HackCTF Write-up' 카테고리의 다른 글

    [HackCTF] World Best Encryption Tool Write-up  (0) 2019.06.10
    [HackCTF] Register Write-up  (0) 2019.05.26
    [HackCTF] RTC Write-up  (1) 2019.05.10
    [HackCTF] SysROP Write-up  (0) 2019.05.07
    [HackCTF] Pwning Write-up  (2) 2019.05.03

    댓글

Designed by Tistory.