
문제는 다음과 같다.
서버를 만들어보고 들어가면

이렇게 뜨는데 도무지 뭔지 모르겠으니 코드를 보자.

코드 구조를 보면, buf 배열의 크기가 고작 0x28 정도인데, %s를 사용하면 엔터나 띄어쓰기를 만나기 전까지 계속 입력받으므로 버퍼오버플로가 발생할 수 있다!
또한 위에 컴파일 옵션에 스택 카나리 보호 기법이 해제되어 있고 바이너리의 메모리 주소가 고정되어있는 것을 알 수 있다.
스택 구조는 아마 아래와 같을 것이다.
| buf (0x28) | SFP(8 bytes) | RET (8 bytes) |
| 입력 데이터 저장 | 이전 함수의 스택 베이스 포인터 | 함수 종료 후 돌아갈 주소 |
우리의 목표는 /bin/sh 를 실행하는 get_shell() 함수다! 저길 노리면 쉘을 얻을 수가 있다.
즉, 버퍼오버플로로 RET 영역을 get_shell() 함수의 시작 주소로 덮어쓰는 것이 목표다.

IDA를 통해 get_shell() 함수의 주소를 찾아봤더니, 0x00000000004006AA라고 나온다!
이 주소를 하드코딩해서 넣으면 되겠다.

작성한 익스플로잇 코드는 다음과 같다.

쉘을 따내서 cat flag 명령어를 입력했더니 플래그가 잘 나오는 것을 확인할 수 있었다! ^.^

'Security > Pwnable' 카테고리의 다른 글
| [Dreamhack] bof (0) | 2026.03.30 |
|---|---|
| [Dreamhack] Basic_exploitation_001 (0) | 2026.03.30 |
| [Dreamhack] baby-bof (0) | 2026.03.16 |
| [Dreamhack] shell_basic (0) | 2026.03.16 |
| [Dreamhack] welcome (0) | 2026.03.16 |