ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Pwnkr] Unexploitable Write-up
    표튜터와 함께하는 Pwnable/Pwnable.kr Write-up 2019.05.17 03:01

    오랜만에 CTF를 풀었다.ㅎㅎ 앞서 SysROP와 RTC를

    풀었던 것이 도움이 되었던 것 같다. 

    풀이가 부족하다면 아래의 링크를 참조하자

    링크 : SysROPRTC 

    처음으로 Pwnkr의 Toddler가 아닌 문제를 풀었다는게 기분이 좋다.

    이번 문제는 SysROP와 RTC 그리고 Rax gadget을

    맞춰주는 것이 관건인 문제이다.



    우선 scp로 바이너리를 가져오자~~




    문제는 NX가 걸려있고 Partial RELRO이므로

    Stack, Heap 영역에 실행권한이 없고

    Got Overwrite가 가능하다.




    문제를 실행시켜보면 간단하게

     사용자로부터 입력을 받는 것이 전부이다.





    IDA로 확인해보니 sleep(3) 이후, read함수로 입력을 받고 있었다.

    buf에 넉넉하게 1295개를 입력 받고 있었다. 






    어셈블리어 코드로 살펴보니 ret를 덮기 직전까지

    0x10 + sfp(8) = 24개의 dummy가 필요하다는 것을 알 수 있었다.





    사용되는 함수를 찾아보면 CSU를 확인할 수 있었고





    우리가 원하는 인자를 셋팅할 gadget 주소들도 구할 수 있었다.




    이제 필요한 것들을 하나씩 구하면서 Payload를 짜보도록 하겠다.

    read@got, sleep@got와 "/bin/sh"이 저장될 고정 주소 영역을 구해보도록 하겠다.




    아주 간단하게 필요한 got를 구할 수 있었다.



    역시나 사용될 고정 주소 영역 .data도 쉽게 구할 수 있었다.



    그럼 이제 Payload를 구성해보도록 하겠다.



    < Payload >

    원리는 다음과 같다. 우선 "/bin/sh"을 고정 주소영역인 .data영역에

    넣어주기위해 Csu gadget을 이용해서 인자를 셋팅해준다.



    보통 plt를 이용하는데 got를 사용하는 이유는 다음과 같다.

    바로 call을 qword ptr로 값을 참조해서 진행하기 때문이다.




    또한 여기서는 그냥 read@got를 사용하더라도

    read함수에서 eax를 0으로 셋팅 후 syscall을

    하기 때문에 굳이 rax를 생각할 필요가 없다.


    다음으로는 syscall gadget을 가져와서 사용해야한다.

    처음 payload를 구성했을 때 read@got의 1byte를

    syscall gadget으로 덮으려고 했는데 제대로 안됐다..

    (이유를 모르겠다.. 실수한건지..쩝..)


    그래서 sleep함수도 있길래 sleep@got의 1byte를




    sleep에서 사용하는 syscall gadget을 사용하기위해

    sleep@got 1byte를 "\xee"로 Overwite 시켰다.

    전에도 말했듯 이것은 ASLR이나 PIE가 걸려있어도

    Offset이 항상 일정하기때문에 그 원리를 이용해서 가능한 것이다.




    Syscall gadget은 만들었는데 제일 중요한 rax를 셋팅할 수 없다..

    주륵... 하지만 방법은 있었다!! 바로 함수의 return의 원리를 이용하는 것!!

    보통 rax는 함수의 ret값을 담는다. 마침 ret되는 rax를 마음대로 조종할 수 있는

    read함수가 있었다~~ 그러므로 우리는 read함수를 호출해서 59개의 값을

    입력해주고 ret로 rax를 59로 셋팅해주면 된다~~ 

    59개가 입력되는 곳은 bss영역을 주었다.(59개인 이유는 execute를 사용하기위해)




    마지막으로 인자를 셋팅해주고 sleep@got를 call하게 되면

    execute("/bin/sh",Null,Null)이 실행되면서 쉘이 따질 것이다.





    짜잔 ~ FLAG를 볼 수 있었다. 이전에 비슷한 두 문제를

    풀어보아서 그런지 생각보다 쉽게 풀 수 있었던 것 같다.


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

    [Pwnkr] Unexploitable Write-up  (0) 2019.05.17
    [Pwnkr] Input2 Write-up  (0) 2019.04.17
    [Pwnkr] Blukat Write-up  (0) 2019.04.15
    [Pwnkr] Black Jack Write-up  (0) 2019.04.15
    [Pwnkr] Cmd1 Write-up  (0) 2019.04.04
    [Pwnkr] Lotto Write-up  (0) 2019.04.03

    댓글 0

Designed by Tistory.