ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Binary Exploitation] loopy #0
    CTF write_up/NACTF 2019. 9. 24. 22:25

    문제를 해결 해 보도록 하겠습니다.

     

    NX 보호기법만 존재 합니다.

     

    문제를 실행해 보면 아래와 같습니다.

     

    입력과 동시에 출력이 됩니다.

     

    간단히 .c 파일을 확인해 보면 놀라울 정도로 짧습니다.

     

    vuln함수에서  gets함수에서 bof가 일어나면서도 printf 함수에서 FSB, 즉, 포맷스트링 취약점이 일어납니다.

     

    FSB 를 이용해서 입력한값이 몇번 오프셋에서 출려되는지 확인해 보겠습니다.

     

    4번 오프셋에 저장이 되네요! 추후 "%4$s"를 사용할것 같습니다.

     

    IDA 32bit로 열어서 분석을 해보겠습니다.

     

    메인 함수에는 아무런 특징이 없기 때문에 vuln함수에 들어가 보겠습니다.

     

    s변수의 크기는 0x48로 72입니다.

     

    먼저 문제를 해결 하기 위해서는 system 함수와 "/bin/sh"를 이용해야 할것 으로 생각이 됩니다.

    그러기 위해서는 함수의 주소를 알아야 하는데... 첨부 파일로 같이 들어있는 libc.so.6을 보면 ASLR이 걸려 있는것 같습니다.

     

    일단 필요한 데이터는 다음과 같습니다.

    1. gets의 PLT 주소

    2. gets의 GOT 주소

    3. printf의 PLT 주소

    4. printf의 GOT 주소

    5. vuln의 주소

     

    먼저 ASLR 때문에 정확한 주소를 찾기 힘들기 때문에 offset 주소 - libc에 있는 함수 주소로 base_addr 을 구할 생각입니다.

     

    현재 프로그램에서는 입력을 1번만 받고 있지만 저희는 2번 입력을 해야합니다.

    1. base address를 구하기 위해서

    2. base address를 바탕으로 만들어진 system 함수 주소를 이용한 exploit!!

     

    필요한 데이터를 하나씩 찾아봅시다.

     

    gets함수의 PLT : 0x8049040

    gets함수의 GOT : 0x804c010

     

     

    printf함수의 PLT : 0x8049030

    printf함수의 GOT : 0x804c00c

     

     

    vuln 함수의 주소 : 0x8049192

     

    그래서 페이로드를 다음과 같이 입력할 것 입니다.

     

    printf 함수의 GOT 값[4] + "%4$s" + dummy[68] + vuln 함수의 주소값 으로 넣을 것입니다.

     

    일단 76의 크기의 dummy값을 넣으면 RET가 나오게 되는데 저희는 입력을 2번 해야하기 때문에 vuln으로 다시 들어가 줍니다.!

     

    그리고 출력되는 데이터는 다음과 같습니다. 

    printf_got[4] + printf의 주소[4] ...

     

    2번째 인자인 printf의 주소를 추출해서 해당 값과 libc안에있는 printf의 offset 과 -연산을 통해서 base 주소를 찾을 수 있습니다.

     

    base주소를 libc.address 에 더해서 libc의 모든 함수의 offset을 주소로 바꾸고 system 을 호출 하면 사용 할 수 있게 됩니다.

     

    위의 내용을 바탕으로 Exploit code를 작성해 보겠습니다.

     

     

     

    Flag : nactf{jus7_c411_17_4g41n_AnZPLmjm}

     

    //-----------------------------------------------------------------------------------------------------------------------

     

    깔끔한 코드를 올려드립니다.!

    댓글

Designed by Tistory.