ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • DreamHack 1단계 basic_exploitation_000
    DreamHack 2021. 7. 14. 13:04

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

     

    pwnable 문제

     

    문제의 환경 정보를 살펴보면, 어떠한 보호 기법도 적용되지 않고 있다는 사실을 볼 수 있다.

     

    buf 의 주소

     

    문제 파일

    main 함수 : buf 에 0x80만큼 사이즈가 할당되는데, 128 바이트가 할당된다.

    그리고 initialize 함수가 실행되고, printf 로 buf 의 주소를 출력해주고, scanf 를 통해서 입력을 받는다.

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

     

    buf 의 크기는 128 바이트가 할당되는데 scanf 로 입력받는 바이트는 141 바이트이므로, 버퍼 오버플로우(BOF) 가 발생할 수 있다.

     

    스택의 기본 구조는 Buffer + SFP (4Byte) + RET (4Byte) 이다.

     

    buf 의 크기는 128 Byte 이고 SFP 의 크기는 4 Byte 이므로 RET 전까지 바이트 수는 132 바이트라는 것을 알 수 있다.

     

    즉, 132 바이트에 쉘 코드를 채운 후 RET 에 침범하여, buf 주소 값을 넣어주면 buf 로 돌아가서 쉘 코드를 실행시켜서 권한을 탈취할 수 있다.

     

     

    이제 쉘 코드를 작성해보겠다.

     

    여기서  Pwntools 을 사용할 것이다.

     

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

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

     

    문제 파일에서 buf 주소 출력이 "buf = (0x-------)" 형식 이므로 "0x-------" 만 취하기 위해 p.recvuntil 를 통해 "buf = (" 문자열을 읽어서 반환한다. 

     

    여기서 buf 의 주소가 10 자리여서 그 10 자리를 16진수로 바꿔서 저장을 하고, buf 의 주소를 출력할 때 개행문자 "\n" 가 있으므로 recvline 을 통해 한 줄을 읽어서 반환한다.

     

    그 후 , 26 바이트 쉘 코드를 작성해주는데, 이때 python2 와 python3 의 방식이 다르므로 만약 python3 를 사용하고 있다면 문자열 앞에 바이트 형식으로 변화해준다는 문자열 b 를 꼭 작성해야 한다 !!

     

    132 바이트 - 26 바이트는 106 바이트 이다. 

     

    즉, 106 바이트는 아무 문자나 채우고  RET 전까지 바이트가 채워지면, buf 의 주소 값을 32 비트 리틀엔디안 패킹 방식으로 넣어준다.

     

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

     

    페이로드 시킨 결과

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

     

    'DreamHack' 카테고리의 다른 글

    DreamHack 1단계 basic_exploitation_002  (0) 2021.07.15
    DreamHack 1단계 basic_exploitation_001  (0) 2021.07.14
    DreamHack 1단계 path traversal  (0) 2021.07.11
    DreamHack 1단계 xss-1  (0) 2021.07.11
    DreamHack 1단계 file-download-1  (0) 2021.07.11

    댓글

Designed by Tistory.