문제 확인
해당 문제는 버퍼 오버플로우 취약점을 사용하여 리턴 어드레스의 값을 덮어쓰도록 하여 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 |