본문 바로가기
Hacking/DreamHack

[DreamHack] 드림핵 baby-bof

by st-og 2024. 10. 30.

문제 확인

 

해당 문제는 버퍼 오버플로우 취약점을 사용하여 리턴 어드레스의 값을 덮어쓰도록 하여 flag를 획득하는 문제이다.

 

서비스 분석

먼저 해당 프로그램을 실행하면 특정 메모리 주소를 출력하며 name을 입력받는다.

 

임의의 값 "test"를 입력하고 실행 시 메모리 주소와 value를 출력하며 hex value를 입력받는다.

 

hex value의 값으로 임의의 값 AAAA를 입력하였으며 그 후에 입력을 요구하는 integer count값으로는 3을 입력하였다.

위와 같이 입력하게 되면 내가 입력한 hex 데이터가 count만큼 메모리에 저장되는 것을 확인할 수 있다.

 

소스 코드

 

위 코드에서 중요하게 봐야 할 부분은 아래 표에 설명되어 있다.

코드 라인 설명
16 win이라는 함수를 생성한다.
22~24 ./flag파일을 열고 데이터를 0x60만큼 읽어와 화면에 출력한다.
33, 41 name이라는 char형 변수를 생성하고 입력을 받는다.
46~48 메모리 주소와 value를 확인할 수 있도록 화면에 출력한다.
50~54 hex값과 count값을 입력받아 각 변수에 저장한다.
57~59 입력 받은 count 값 만큼 for문을 실행한다.
name을 long형으로 변환하여 8바이트 묶음으로 변경하고 idx*8을 통해 8바이트 단위로 접근하도록 한다.
그렇게 접근된 메모리 주소에 value를 저장한다.
62~65 46~48과 동일한 코드이다.

 

문제 해결

현재 57~59번 라인에서 idx*8만큼의 메모리 주소에 value를 삽입할 수 있도록 되어있으며 count의 값을 사용자가 입력하여 idx를 조절할 수 있다. 여기서 공격자는 value의 값을 win함수의 주소로 입력하고 count의 값을 리턴 어드레스를 덮을 정도의 수로 입력하게 된다면 해당 프로그램이 동작을 끝내고 리턴 어드레스를 실행하려 하면 win함수가 실행될 것이며 flag를 획득할 수 있게 된다.

 

win함수의 주소는 프로그램을 동작하면 가장 먼저 보여주는 메모리 주소이다.

이를 활용하여 아래와 같이 입력하게 되면 FLAG를 획득할 수 있게 된다.

 

FLAG

'Hacking > DreamHack' 카테고리의 다른 글

[DreamHack] 드림핵 basic_exploit_003  (0) 2024.10.31
[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