Security/Pwnable

[Dreamhack] Basic_exploitation_001

SpruceMoon 2026. 3. 30. 22:42

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

 

압축 파일 내의 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 freeware를 사용해 알아낸 read_flag의 주소

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