본문 바로가기
Hacking/DreamHack

[DreamHack] 드림핵 basic_exploit_003

by st-og 2024. 10. 31.

문제 확인

 

해당 문제는 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