ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [LOB] Assassin -> Zombie_Assassin Write-up
    표튜터와 함께하는 Pwnable/The Lord Of the BOF Write-up 2019. 3. 5. 03:47

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



    이번 문제를 풀기위해서는 이전 문제와는 비슷하지만 새로운 개념이 필요하다!!

    우선 코드를 보자!

    이전의 문제와 거의 같으나 이번에는 입력되는 값을 버퍼에 저장할 때

    길이 제한이 걸려있다. 또한 힌트로 주어진 것은 바로 FEBP이다.

    FEBP는 Fake ebp를 의미하는데 이번에는 ret gadget뿐만아니라 leave gadget도 이용해야한다.


    Fake ebp의 원리는 그림과 같다.

    sfp에 &buffer-4값을 넣어주고

    ret에는 leave gadget주소를 넣어준다.

    버퍼에는 쉘코드 주소와 nop으로 채워준다.


    그렇게되면 에필로그 진행 시 공격이 시작되며

    (1)leave gadget 진행 시,

    (2)[pop ebp]가 진행되면서 pop으로 인해 esp가 +4되고 

    (2)ebp는 sfp에 저장된 주소를 따라 &buffer - 4의 주소값을 가지게된다.


    다음으로 ret gadget을 진행하게되면

    [ pop eip]가 진행되면서 (2)esp+4 되었던 주소값이 (2)eip로 저장되고 (3)esp값은 한더 +4 된다.

    [ jmp eip]로 인하여 (2)eip 주소값으로 가서 실행되는데 그림에서 볼 수 있듯이

    해당 주소는 leave gadget이므로 다시한번 leave gadget 진행된다.


    leave gadget이 진행되면서

    (4)[ mov esp, ebp ]로 인해 esp와 ebp 둘다 &buffer-4의 주소값을 가지게 되고

    (5)[pop ebp]로 인하여 esp는 +4 된다. 또한 ebp는 dummy 값을 가지게 된다.

    (ebp 값은 &buffer-4가 가지고 있던 dummy 값)


    다음으로 ret gadget이 진행되면서

    (6)[ pop eip ]로 (5)esp+4의 값 즉, buffer의 시작주소값이 (6)eip에 저장되고 (7)esp는 한번 더 +4된다.

    (6)[ jmp eip ]로 인하여 buffer부터 실행이 되는데

    우리는 버퍼의 시작주소에 shellcode를 넣어놓을 것임으로

    shellcode가 실행되어 쉘이 따지게된다.

    (sfp까지의 남은 버퍼의 크기는 nop으로 채워놓는다)



    이러한 모양으로 Fake ebp가 진행될 것이다.

    첫 번째 fake ebp로 인해 leave gadget 실행 시 ebp가 fake ebp2로 옮겨질 것이고

    두 번째 에필로그에서 fake ebp2를 ebp에 넣고 esp가 + 4인 a를 리턴하여 실행할 것이다.

    이와 같은 작업으로 fake ebp3를 ebp에 넣고 b를 리턴하여 실행하게되는 원리로

    이번 공격을 진행하면 된다.



    이제 공격에 필요한 것들을 하나씩 구해보자

    이전 문제와 마찬가지로 두 가지 방식으로 풀 수 있다.



    * 풀이1. System 함수 이용 * 


    leave gadget은 쉽게 구할 수 있었다. 0x80484df



    buffer에 "a"*40개 sfp에 "bbbb" ret에 "cccc"를 넣어주었다.

    "a"가 시작되는 파란색상자가 buffer의 시작이므로 빨간상자부분이 &buffer-4의 값이다.

    그러므로 &buffer-4 = 0xbffffa7c


    마지막으로 "/bin/sh"과 system함수주소는 이전문제들에서 많이 구했기 때문에 생략한다.

    system 함수 주소 = 0x40058ae0

    "/bin/sh"의 주소 = 0x400fbff9


    우리는 더 이상의 fake ebp는 필요없으므로 다음 fake ebp를 일으킬 수 있는 자리에 "aaaa"를 넣어주었다.


    Payload = "aaaa" + System함수 + dummy(4) + "/bin/sh"주소 + nop(24) + buffer주소-4 + leave gadget주소

    세그멘테이션 폴트가 일어나서 core파일을 보기로 했다.



    우리가 다음 fake ebp를 일으킬 수 있는자리에 넣어놓은 aaaa가 보인다.

    그러므로 fake ebp자리에 0xbffffa7c가 아닌 0xbffffa80을 넣어주면된다!

    0xbffffa80을 넣어주면 esp가 esp+4를 가리키기 때문에 0x40058ae0부터 실행될 것이다.





    쉘이 따졌다~~




    * 풀이2. Shellcode 이용 * 


    이용한 Shellcode(25Byte)

     "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53

    \x89\xe1\x89\xc2\xb0\x0b\xcd\x80"



    Payload = Shellcode주소 + Shellcode + nop * 11 + shellcode주소가 있는 주소 + leave gadget

    우선 nop을 주어서 buffer의 시작주소를 찾아보았다.



    쉘코드의 시작주소는 0xbffffa84이기 때문에 nop*4대신 0xbfffffa84를 넣어주고

    이 쉘코드를 실행시키기위해 fake ebp값은 0xbfffffa7c를 넣어주면 

    leave gadget이 한 번더 진행될 때 leave로 인해 esp+4가 진행되고

    ret gadget으로 인하여 쉘코드 주소부터 실행되어 깔끔하게 쉘이 따질 것이다.


    쉘이 따졌다~




    이 문제를 풀면서 알 수 있었던 것은 FEBP는 무조건적으로 &buffer-4를 주는 것이 

    고정된 절차가 아니라 메모리를 보면서 자신이 Fake ebp로 사용할 곳을

     생각하면서 이용해야 한다는 것이다


    다음단계로~




    반응형

    댓글

Designed by Tistory.