
문제는 다음과 같다. 우선 파일부터 다운받아보자.

압축 파일 내의 C 파일을 보면 저렇게 생겼다. 저중에서도 cat flag 명령을 내는 read_flag() 함수가 중요할 것 같다. 이걸 실행시키는 게 목표일 것 같은데, 어디에도 read_flag()를 실행하는 명령은 없다.
main() 함수를 보면 gets 함수가 보인다. 얘는 입력값의 길이를 검증하지 않아서 128바이트보다 큰 데이터를 입력하면 버퍼오버플로가 일어나는 취약점이 있다고 했었다.
즉, gets 함수에 버퍼오버플로우를 이용하면 read_flag에 닿을 수 있지 않을까?!
32비트인 x86 환경에서 main 함수의 스택 프레임 구조는,
| buf (128 bytes) | SFP (4 bytes) | RET (4 bytes) |
| gets() 입력이 저장되는 곳 | 이전 함수의 베이스 포인터 | 돌아갈 다음 명령어의 주소 |
보다시피 이렇게 생겼다.
즉, buf 부분과 SFP을 더미 데이터로 채우고, RET 영역에 read_flag() 함수의 주소를 덮어씌우면 실행이 될 것이다!
그러므로 더미 데이터로 처리해야하는 크기는 총 132바이트다.

IDA를 사용해서 read_flag의 주소가 0x080485B9 인 것도 알아냈으니, 남은 것은 코드 작성 뿐이다!

파이썬을 이용해서 코드를 작성하였다. 페이로드를 구성해서 sendline()으로 페이로드를 전송하고 플래그를 얻어냈다!


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