ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Pwn] Yes or no
    CTF write_up/Hack CTF 2019. 12. 9. 13:27

     

    김현식 aka.Gyul 님이 만드신 문제인 Yes or no 문제입니다.

    18.04 기준으로 Test가 됬다고 되어 있어서 Ubuntu 18.04 에서 Exploit를 했습니다.

     

    파일을 다운받아 열어보면 2개의 파일이 존재 합니다.

     

    libc 파일을 준것으로 보아 RTL을 사용해야 할것으로 예상이 됩니다.

    먼저 파일의 보호기법을 확인해 보고 실행해 보겠습니다.

     

    NX를 제외 하고는 없는 것같아 보입니다.

     

    숫자를 입력하니까 do_system+1094 라는 문자열을 출력하면서 good luck을 외치고 종료를 합니다.

    do_system+1094 라고 검색을 해보니 중국어 간체로 되어있는 사이트 들에서 해당 문제점을 다룬 모습을 확인 할 수 있었습니다.

    do_system+1094는 2.27 glibc 버전에서 발생하는 system 함수 내에서 생성되는 오류 입니다.

     

    rsp의 값이 16바이트로 채워져 있지 않으면 do_system+1094 에 존재하는 명령어 에서 오류가 나게 됩니다.

     

     

    그렇기 때문에 가젯을 잘 맞춰 넣어야 합니다.

     

    일단은 IDA를 한번 확인해 보겠습니다.

     

    fgets로 한번 입력받고 그 값을 바탕으로 조건문의 로직이 이루어지면 gets함수를 만날수 있습니다.

    또한 해당 gets 함수에서 bof가 일어날 수 있습니다.

     

    그렇다면 v10 == v6 * v5 << (++v11 % 20 + 5)에 bp를 걸고 비교 하는 값을 확인해 보겠습니다.

     

    0x4007b4에 bp를 걸고 값을 확인해 보면 아래와 같습니다.

    입력은 1234로 했습니다.

     

    일단 RAX에는 0x960000이 들어가 있습니다.

     

    rbp-0x8에 어떤 값이 들어있는지 확인해 보겠습니다.

     

    0x4d2 로 1234 라는값이 hex값으로 저장이 되었습니다.

     

    0x960000이 되는 값을 넣으면 되는데 제가 넣은 값이 hex값으로 들어가는 값을 입력해주면 되는 것 같습니다.

     

    9830400을 넣으면 될 것 같습니다.

     

    성공 하였습니다.

    이제 gets로 할 수 있는 작업을 생각해 봐야 겠습니다.

    일단 system함수를 이용해야하고 /bin/sh 문자열도 필요합니다.

     

    필요한 가젯은 ROPgadget 툴을 이용해서 사용하겠습니다.

    필요한 가젯은 "/bin/sh"를 pop 해줄수 있는 pop_rdi_ret 과 system함수를 실행 해줄수 있는 ret 가젯을 이용하면 될 것 같습니다.

     

    하지만 system 함수의 주소 및 "/bin/sh" 문자열 주소를 가져오기 위해서는 제공받은 libc 파일에서 leak을 해야하는데 해당 주소는 진짜 주소가 아닌 offset 주소 입니다. 그렇기 때문에 base주소를 구하기 위해서 특정 함수의 주소를 실행 파일(서버쪽 파일)내에서 leak 해야 할것 같습니다.

     

    puts 함수 주소를 leak 해서 다시 main으로 return 을 한뒤에 system 함수를 입력해서 Exploit 하는 것을 Exploit Code를 작성하면 될 것 같습니다.

     

    Exploit Code를 작성하기 전에 gadget 을 구하기 위해서 ROPgadget 이라는 툴을 사용해 보겠습니다.

     

     

    많은 gadget 들이 출력이 되었습니다.

    저희가 필요한 gadget은 pop rdi ret 과 ret 입니다.

     

    pop rdi ret : 0x400883

    ret : 0x40056e

     

    이제 Exploit Code를 작성해 보겠습니다.

     

     

    system_addr 을 삽입하는 payload를 확인해 보면 p64가 4개 여서 0x20의 길이입니다.

     

    실행 결과를 확인해 보면 아래와 같습니다.

     

    0x0a 는 "\n"이기 때문에 제외 해보면 정확히 0x20 으로 16바이트를 꽉 채우고 있습니다.

    그래서 Exploit을 성공 했습니다.

     


    Reference 

    http://homura.cc/blog/archives/168

    https://stackoverflow.com/questions/54393105/libcs-system-when-the-stack-pointer-is-not-16-padded-causes-segmentation-faul

    'CTF write_up > Hack CTF' 카테고리의 다른 글

    [Pwn] Gift  (0) 2019.10.25
    [Pwn] Look at me  (0) 2019.09.24
    [Pwn] RTL_Core  (0) 2019.09.24
    [Pwn] Random Key  (0) 2019.09.24
    [Pwn] 1996  (0) 2019.09.24

    댓글

Designed by Tistory.