ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • DreamHack 1단계 basic_exploitation_003
    DreamHack 2021. 7. 30. 16:30

    DreamHack 1단계 basic_exploitation_003 문제를 풀어보겠다.

     

    pwnable 문제

     

    문제의 환경 정보를 살펴보면, NX 보호 기법이 활성화 된 것을 볼 수 있다.

     

    위 그림에서 NX 보호 기법이 활성화 되어있음에 따라 쉘 코드가 실행되지 않다는 것을 알 수 있다.

    또한, RELRO 가 Partial 로 되어있는 것으로 보아 GOT Overwrite 가 가능하다는 것을 알 수 있다.

     

    특징으로 함수 호출 시, 해당 함수의 주소를 알아와서 쓰기가 가능하다는 것이다.

    - PLT 는 코드, GOT 는 주소 값이 저장된 공간

     

    문제 파일

     

    main 함수 : heap_buf 에 0x80만큼 사이즈가 동적 할당되는데, 128 바이트가 동적 할당되고, stack_buf 에 0x90만큼 할당되는데, 144 바이트가 할당된다.

     

    그리고 initialize 함수가 실행되고, gets 로 buf 를 입력을 받는다.

     

    initialize 함수를 보면, 실행되고 30초가 지나면 Time Out 메시지를 출력하고 프로그램을 종료한다.

     

    sprintf 는 화면에 출력하지 않고 문자열을 만들어 저장하는데, 저장 성공 시 만든 문자열의 길이를 출력한다.

     

    sprintf 를 이용하여 heap_buf 내용을 stack_buf 에 출력한다.

     

    그리고 printf 를 이용하여 stack_buf 를 출력하고 종료한다.

     

    이를 통해, sprintf 에 FSB 가 발생할 수 있다.

     

    하지만, 동시에 snprintf 처럼 사이즈를 정한 것이 아니기 때문에 BOF 가 발생할 수 있다.

     

    즉, heap_buf 에서 stack_buf 로 출력할 때, %1000c 가 저장되어 있다면, heap_buf 에는 "%1000c" 로 6 자리 문자열로 인식되지만, stack_buf 에는 1000 바이트가 입력된다.

     

    이를 통해, RET 까지 %----c 로 채우고, RET 에 get_shell() 함수 주소를 입력하면 된다.

     

    get_shell 함수 : system 명령어로 /bin/sh 의 주소를 출력한다.

     

    이때 필요한 것은 get_shell() 함수의 주소, printf 의 GOT 주소, stack_buf 의 주소이다.

    get_shell 함수의 주소

     

    printf 의 GOT 주소

     

    disas main 실행 화면

    위 실행화면으로 보아 stack_buf 의 주소가 ebp-0x98 인 것을 알 수 있다.

    이를 통해, stack_buf 가 ebp 로부터 0x98 (152 바이트) 떨어져 있다는 것을 알 수 있다.

     

    스택 구조를 보면, stack_buf + SFP (4Byte) + RET (4Byte) 이다.

     

    그러므로 152 + 4 바이트를 하여 156 바이트 만큼 채워 RET 부분에 get_shell() 함수의 주소를 넣어준다.

     

    이번에도  Pwntools 을 사용할 것이다.

     

    Pwntools 을 활용하여 작성한 페이로드

    먼저 pwn 모듈을 사용하기 위해서 import 시키고, 해당 문제가 있는 서버로 원격 접속을 하기 위해서 remote 클래스를 사용한다.

     

    그 후, get_shel() 함수의 주소를 작성한다.

     

    페이로드에는 156 바이트 만틈 채우고 get_shell()  함수의 주소 값을 32 비트 리틀엔디안 패킹 방식으로 넣어준다.

     

    그 후, sendline 를 통해 payload 의 값을 전송하고, interactive 를 통해 쉘에 접속한다.

     

    페이로드 시킨 결과

     

    실행을 하면, 권한을 탈취하여 FLAG 값을 얻을 수 있다.

     

    'DreamHack' 카테고리의 다른 글

    DreamHack 2단계 image-storage  (0) 2021.08.06
    DreamHack 2단계 csrf-1  (0) 2021.08.03
    DreamHack 1단계 basic_exploitation_002  (0) 2021.07.15
    DreamHack 1단계 basic_exploitation_001  (0) 2021.07.14
    DreamHack 1단계 basic_exploitation_000  (0) 2021.07.14

    댓글

Designed by Tistory.