ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Giant -> Assassin Write-up
    표튜터와 함께하는 Pwnable/The Lord Of the BOF Write-up 2019.03.04 03:12

    혹시나 이상하거나 잘못된 것이 있다면 댓글 부탁드립니다.



    이번 문제는 ROP를 알기전에 해두면 도움이되는 Ret Sled를 배울 수 있는 문제이다.

    (나는 ROP를 먼저했었다..ㅎㅎ)


    이 문제를 풀려먼 에필로그에 대한 이해가 필요하다.

    에필로그는 보통 leave와 ret gadget으로 이루어져있으며



    * leave gadget의 경우 *

    [ mov esp, ebp]

    [ pop ebp]


    * ret gadget의 경우 *

    [ pop eip ]

    [ jmp eip ]



    형태로 이루어져있다.

    ret gadget이 진행되면 esp는 + 4가 되며

    [ pop eip ]의 eip에는 esp의 값이 저장되어지는데

    ret주소에 ret gadget을 넣어주고 그 뒤에 쉘코드를 넣어주게되면

    ret gadget이 한 번 더 일어나게되면서 esp가 +4 되어 쉘코드를 가리키게 됨으로 

    쉘코드를 실행시킬 수 있게된다. 


    * 주의 !! *

    ret 공간과 ret gadget은 다르다.

    ret는 stack에 있는 ret 주소를 의미하는 것이고

    ret gadget은 code영역에 있는 instruction을 의미하는 말이다.




    이제 소스 코드를 보도록하자!!

    코드를 보면 Stack을 이용하는 것도 RTL을 이용하는 것도 아니라는 힌트를 주어준다.

    또한 제약조건을 보면 변조할 ret를 0xbf 로시작하는 주소나 0x40으로 시작하는 주소를 사용할 수가 없다.

    그 의미는 방금 설명한 RTL이나 Stack영역을 사용할 수가 없다는 의미이다.

    이럴 때 사용하는 것이 바로 위에서 설명한 Ret Sled이다.



    변조할 ret를 ret gadget의 주소로 진행하게 된다면 ret gadget은 0x80으로 시작하기 때문에

    기본적으로 위에서 설명한 제약조건을 우회할 수 있게된다.



    공격방식은 다음의 그림과 같다.

    정상적인 ret gadget 즉, ret instruction이 일어날 때,

    [pop eip] 과정에서 eip에 esp가 저장되고 esp는 [pop eip]가 되므로  주소값이 + 4가 된다.

    그 뒤 [jmp eip]를 하게되는데 이 때 eip (esp)값이 그림에서 보다시피 또다시 ret gadget이므로

    다시한번 ret instruction이 일어나게된다.

    [pop eip]과정에서 esp가 eip에 저장되는데 현재 esp는 + 4 된 주소값을 가지고 있기 때문에

    eip에는 기존의 esp + 4의 주소가 저장된다.

    그 뒤 [jmp eip]를 하게되면 esp + 4가 가리키고 있는 shellcode의 시작 주소로 jmp하면서

    쉘코드가 실행되는 원리이다.



    그렇다면 필요한 것들을 하나씩 찾아보도록 하겠다.

    아주 손쉽게 ret gadget 주소를 알게 되었고




    shellcode를 사용해도 되지만  system함수와 "/bin/sh"을 이용해보겠다.

    이전 풀이들에서 많이 해봤기 때문에 간략하게 설명하겠다. 

    libc_base를 구한 뒤에

    system함수의 offset을 구해서 system함수의 정확한 주소를 구했고




    역시 "/bin/sh"의 offset을 구해서 정확한 "/bin/sh"의 위치를 구했다.





    풀이1.  System함수 이용 *


    Payload = "a"*44 + ret gadget주소 + system함수주소 + dummy(4) + "/bin/sh"주소

    복사본에 진행하였더니 쉘따는데 성공하였다.



    같은 방식으로 원본도 깔끔하게 성공했다!!






    * 풀이2.  Shellcode 이용 *


    아까말한대로 쉘코드를 이용한 공격도 가능하다.

    Payload = "a"*44 + ret gadget주소 + shellcode주소 + nop sled + shellcode + nop(쉘코드 실행방해방지용)

    다음 단계로~






    댓글 0

Designed by Tistory.