-
DreamHack 1단계 basic_exploitation_002DreamHack 2021. 7. 15. 16:33
DreamHack 1단계 basic_exploitation_002 문제를 풀어보겠다.
위 그림에서 NX 보호 기법이 활성화 되어있음에 따라 쉘 코드가 실행되지 않다는 것을 알 수 있다.
또한, RELRO 가 Partial 로 되어있는 것으로 보아 GOT Overwrite 가 가능하다는 것을 알 수 있다.
특징으로 함수 호출 시, 해당 함수의 주소를 알아와서 쓰기가 가능하다는 것이다.
- PLT 는 코드, GOT 는 주소 값이 저장된 공간
main 함수 : buf 에 0x80만큼 사이즈가 할당되는데, 128 바이트가 할당된다.
그리고 initialize 함수가 실행되고, gets 로 buf 를 입력을 받는다.
initialize 함수를 보면, 실행되고 30초가 지나면 Time Out 메시지를 출력하고 프로그램을 종료한다.
원래, printf("%s", &buf) 이어야 하는데, printf(buf) 이므로 Format String Bug 가 발생할 수 있다.
즉, 서식문자 입력시, 그 서식문자의 기능대로 출력한다는 문제점이 발생한다.
read 로 0x80 만큼 문자열을 입력받기 때문에, BOF 는 발생하지 않는다는 것을 알 수 있다.
get_shell 함수 : system 명령어로 /bin/sh 의 주소를 출력한다.
여기서 스택은 buf 의 128 바이트와 exit 로 구조가 되어있는데,
buf 에 서식문자를 넣어서 FSB 를 발생시켜, get_shell 함수를 실행시킨다.
그러기 위해서는 exit(0) 을 활용해야 하는데, exit 의 GOT 를 get_shell 함수 주소로 Overwrite 해야한다.
이때 필요한 것은 exit 의 GOT 주소와 get_shell 함수의 주소이다.
페이로드를 작성하기 전에 입력 값을 몇 번째 서식문자열에서 참조하는지 확인해야 한다.
위 그림을 보면, 우선 4바이트 체제이기 때문에 a 를 4번 입력하고 %x 를 입력함으로써 16진수로 출력하게 한다.
첫 번째 %x 에서 aaaa 를 인자로 받는 것을 알 수 있다.
이번에도 Pwntools 을 사용할 것이다.
먼저 pwn 모듈을 사용하기 위해서 import 시키고, 해당 문제가 있는 서버로 원격 접속을 하기 위해서 remote 클래스를 사용한다.
그 후, exit GOT 의 주소를 작성한다.
페이로드 구조는 |exit_got+2| + |exit_got| + "%2044c%1$hn" + "%32261c%2$hn" 이다.
뒤에 인자는 get_shell() 함수의 주소 (0x8048609) 이다.
exit_got 의 주소 값을 32 비트 리틀엔디안 패킹 방식으로 넣어준다.
%n 은 4바이트씩 인자에 write 해주는 기능인데, get_shell() 함수의 주소가 값이 크기 때문에 2바이트씩 나눠 전송하려고 %hn 을 사용한다.
따라서, %1$hn 은 처음 2바이트만 인자로 받겠다는 의미이다. 뒤에 %2$hn 도 같은 의미이다.
exit_got : 0x8609
exit_got + 2 : 0x804
이때 exit GOT 주소 작성에 8 바이트를 사용하여서 0x8 만큼 빼줘야한다.
0x804 = 2052 -> (0x804-0x8) = 2044
0x8609 - 0x804 = 32261
위의 값들 이후에 c 를 기입한 이유는 큰 수 사용 시 c 를 사용하기 때문이다.
그 후, sendline 를 통해 payload 의 값을 전송하고, interactive 를 통해 쉘에 접속한다.
실행을 하면, 권한을 탈취하여 FLAG 값을 얻을 수 있다.
'DreamHack' 카테고리의 다른 글
DreamHack 2단계 csrf-1 (0) 2021.08.03 DreamHack 1단계 basic_exploitation_003 (0) 2021.07.30 DreamHack 1단계 basic_exploitation_001 (0) 2021.07.14 DreamHack 1단계 basic_exploitation_000 (0) 2021.07.14 DreamHack 1단계 path traversal (0) 2021.07.11