ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [HackCTF] Pwning Write-up
    표튜터와 함께하는 Pwnable/HackCTF Write-up 2019.05.03 23:50

    이번 문제는 Pwning이다. HackCTF에서 

    가장 많은 삽질을 한 문제인 것 같다.. 허허..

    풀었으니 너무나 다행이다. ㅎㅎ



    바이너리에는 NX가 걸려있고 Partial RELRO이다.

    Data, heap, stack 영역에 실행권한이 없고

    got overwrite가 가능하다~~



    사용자로부터 읽어올 바이트 길이를 물어보았다.

    나는 11을 입력했고 내가 입력한 값을 보여주었다.

    내가 처음 입력한 길이값만큼을 보여주는 것같다.



    IDA를 이용해서 코드를 보도록 하자!



    < main >

    "취약하다"라는 의미의 vuln함수를 호출하고 있다.




    < vuln >

    get_n이라는 함수를 두 번 호출하고 있으며 처음 입력받은

    v2(길이)값이 32보다 크면 사이즈가 너무 크다는

    문자열이 출력된다는 것을 알 수 있었다.



    < get_n >

    getchar 함수로 한 문자씩 입력을 받고 있었고 길이가 우리가 입력한

    길이보다 커지거나 버퍼값이 10을 확인하는 것으로 보아

    0xa 즉, 개행이 되면 while문을 탈출하도록 만든 것 같다.




    음... 이 문제를 풀기위한 keyword는 일단 ret값을

    덮을 수 있는지 확인해야 한다.

    ebp로부터 0x2c + sfp(4) = 48 뒤에 ret가 있음을

    알 수 있다. 그러므로 최대 32까지 덮을 수 있는 우리는

    ret를 덮을 수 있는 것이 불가능하다고 생각하게된다.



    But...!!!!

    길이를 입력받는 변수 v2의 자료형을 잘보도록하자!!

    이는 바로 언더플로우를 이용하는 것이다!!

    그러므로 -1을 입력하게되면 최고로 큰 값인

    4294967295로 받아들이게 된다.




    짜자잔~~~ 그렇다면 이제 우리는 ret를 덮을 수 있게된다.



    그럼 이제 RTL을 이용해서 주소를 leak해보도록 하겠다.

     ret의 위치는 이미 위에서 구해놓았고

    필요한 것들을 하나씩 구해보도록 하자.



    이 부분을 생각해내는 것이 많이 오래걸렸다..(역시 아직멀었다..)

    우리는 printf 함수를 이용해서 printf@got를 인자로 printf의 실제주소를 leak한 다음,

    그 주소의 3Byte를 이용해서 서버에서 사용하는 libc를 알아내야한다.

    libc를 알면 offset을 구할 수 있기 때문에 printf의 offset을 이용해서

    libc base를 구한 뒤 system offset과 "/bin/sh" offset을 이용하여

    libc base에 offset을 더해 각각의 system함수와 "/bin/sh"의 실제 주소를 구해준다.



    아까 ret값을 vuln 함수로 덮었기 때문에 다시 vuln 함수가 실행되며

    똑같이 "-1"을 입력한 뒤 ret를  system 함수로 덮어주고

    인자를 "/bin/sh"로 줘서 실행시키면 쉘을 딸 수 있게 된다.



    그렇다면 위의 내용대로 필요한 것들을 구해보자!!!




    ret 위치를 알고 있으니 print@plt 부터 구해보자.




    이번에는 print@got이다.




    다음으로는 vuln이 다시 진행되야하므로

    vuln함수 주소도 미리 구해주자~




    그러면 이제 printf 함수의 실제주소를 leak해보자~




    HackCTF gift문제에서 말했듯 3바이트를 이용하면

    어떤 libc를 사용하는지 찾을 수 있고 offset도 구할 수 있다.


    Gift Write up : https://xn--vj5b11biyw.kr/193

    libc database web : https://libc.blukat.me/




    < libc database web >

    system offset = 0x3a940

    printf = 0x049020

    "/bin/sh" = 0x15902b




    이제 필요한 것들은 다 구했다. libc base를 구하고

    RTL을 진행해보도록 하자!!!





    < Payload >

    아까의 설명처럼 Payload를 구성하였다~~





    짜잔 FLAG를 볼 수 있었다~~

    생각해내기 쬐끔 어려운 문제였다... ㅠ

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

    [HackCTF] RTC Write-up  (0) 2019.05.10
    [HackCTF] SysROP Write-up  (0) 2019.05.07
    [HackCTF] Pwning Write-up  (0) 2019.05.03
    [HackCTF] g++ pwn Write-up  (0) 2019.04.30
    [HackCTF] 1996 Write-up  (0) 2019.04.29
    [HackCTF] Poet Write-up  (0) 2019.04.29

    댓글 0

Designed by Tistory.