문제 확인
해당 문제는 bof 취약점을 활용하여 리턴 어드레스의 값을 변조하여 flag를 획득하는 문제이다.
서비스 분석
해당 프로그램을 실행시키면 입력을 받게 되며 입력받은 문자를 ECHO 하는 것을 확인할 수 있다.
GDB를 통해 어셈블리어를 확인하면 위와 같은 구조를 확인할 수 있다.
소스 코드
위 소스코드에서는 get_shell이라는 함수와 main함수를 중요하게 확인하면 된다.
코드 라인 | 설명 |
15~17 | get_shell이라는 함수는 system함수를 사용해서 /bin/sh을 실행한다. 즉, 쉘을 실행하는 함수이다. |
19 | heap_buf라는 변수에 0x80만큼 동적 메모리 공간을 만들어 준다. |
20 | stack_buf라는 변수에 0x90만큼의 리스트를 만든다. |
22 | read함수를 통해 heap_buf에 0x80만큼의 데이터를 읽어와 저장한다. |
23 | sprintf 함수를 통해 heap_buf에 저장된 값을 stack_buf에 저장한다. |
24 | stack_buf에 저장된 값을 출력하고 프로그램을 종료한다. |
문제 해결
23번 라인에서 sprintf 함수를 통해 heap_buf에 저장된 값이 stack_buf에 저장될 때 어떤 형식으로 저장될지 선언해 주지 않았다.
고로 만약 heap_buf에 사용자가 입력으로 문자열 포멧팅을 입력했을 경우 stack_buf에 데이터가 저장될 때 문자열로 인식하지 않고 문자열 포맷팅의 형식으로 저장이 되게 된다. 이를 이용하여 stack_buf에 버퍼 오버플로우를 발생시킬 수 있다.
위의 어셈블리어를 통해 확인한 구조에서는 ebp-0x98에 stack_buf가 저장되는 것을 알 수 있으며 sprintf함수를 통해 데이터가 저장되기에 SFP 4바이트를 계산하여 리턴 어드레스까지의 거리가 156바이트라는 것을 알 수 있다.
이렇게 찾은 취약점을 바탕으로 아래의 exploit코드를 작성하였다.
코드 라인 | 설명 |
3 | 드림핵 워게임 서버에 연결한다 |
4 | 현재 내 경로에 저장된 바이너리 파일을 읽어온다 |
6 | 해당 파일에서 get_shell이라는 함수의 주소를 가져와 저장한다. |
9 | %156c는 156개의 공백 문자열을 생성하는 포멧 스트링이며 이를 사용하여 리턴 주소까지 더미데이터를 삽입한다. |
10 | 32비트 운영체제에 연결하기에 p32를 사용하여 get_shell을 리틀 엔디안으로 변경한다. |
12~14 | 작성한 페이로드를 전송하고 쉘을 뛰운다. |
위의 exploit코드와 같이 작성하여 실행할 경우
FLAG
FLAG를 획득할 수 있다.
'Hacking > DreamHack' 카테고리의 다른 글
[DreamHack] 드림핵 baby-bof (0) | 2024.10.30 |
---|---|
[DreamHack] 드림핵 bof (0) | 2024.10.28 |
[DreamHack] 드림핵 shell_basic (0) | 2024.10.28 |
[DreamHack] 드림핵 Apache htaccess (0) | 2024.01.20 |
[DreamHack] 드림핵 out of money (0) | 2024.01.19 |