-
DreamHack 1단계 basic_exploitation_000DreamHack 2021. 7. 14. 13:04
DreamHack 1단계 basic_exploitation_000 문제를 풀어보겠다.
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 을 사용할 것이다.
먼저 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