-
DreamHack 1단계 basic_exploitation_003DreamHack 2021. 7. 30. 16:30
DreamHack 1단계 basic_exploitation_003 문제를 풀어보겠다.
위 그림에서 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 의 주소이다.
위 실행화면으로 보아 stack_buf 의 주소가 ebp-0x98 인 것을 알 수 있다.
이를 통해, stack_buf 가 ebp 로부터 0x98 (152 바이트) 떨어져 있다는 것을 알 수 있다.
스택 구조를 보면, stack_buf + SFP (4Byte) + RET (4Byte) 이다.
그러므로 152 + 4 바이트를 하여 156 바이트 만큼 채워 RET 부분에 get_shell() 함수의 주소를 넣어준다.
이번에도 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