| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
- 교체 정책
- randzzz
- 운영체제
- OS
- adsp독학
- rev-basic-3
- ADsP합격
- rev-basic-4
- 26년 1회
- 세그먼테이션
- 병행성
- OWASP TOP 10
- Juice Shop
- OpenClaw
- wargame
- cloudgoat
- AWS
- Simple Crack Me
- 시나공ADsP
- dreamhack
- writeup
- user pool
- HRRN
- Pacu
- ADsP시험
- ADsP
- 라운드로빈
- id pool
- ADsP책추천
- ADsP교재
- Today
- Total
chon
[Dreamhack] randzzz Write up 본문
[ 문제 링크 | https://dreamhack.io/wargame/challenges/932 ]
로그인 | Dreamhack
dreamhack.io
[ 문제 설명 ]

[ 문제 풀이 ]

분석을 위해 먼저 IDA에서 main 함수를 확인했다.
초반 실행 흐름은 여러 번 sleep을 수행한 뒤 rand() 를 연속으로 호출하는 형태였다.
강조된 부분을 보면 rand()가 입력을 받기 전에 이미 세 번 호출되며,
입력 직후 네 번째 rand()가 조건문에서 사용되는 구조임을 알 수 있다.
이때 srand()로 시드를 초기화하지 않기 때문에 rand()는 항상 동일한 난수열을 반환하게 되고,
결국 조건문에서 사용하는 rand() % 10의 값도 매번 같은 값이 된다.
이 점이 문제를 푸는 핵심 단서였다.

IDA로 바이너리를 열어보면 main 함수에서 사용자 입력을 받고, 이어서 두 개의 조건문(if)이 실행되는 구조라는 것을 바로 확인할 수 있다.
구조 파악
- rand()는 시드가 없어서 고정된 난수열을 생성함
- 올바른 숫자만 입력하면 두 if문이 모두 True
- 앞부분(28B)과 뒷부분(36B)의 암호화 데이터를 순서대로 복호화
- 블록 내부의 암호화된 배열(v4, v6)은 get_flag() 함수를 통해 복호화되어 v8 버퍼에 차례대로 이어 붙여 전체 flag를 복원
조건 파악
프로그램은 시작하자마자 sleep(1)을 호출하고, 이어서 seconds = rand() + 1; 값을 기반으로 다시 sleep을 하기 때문에 프로그램을 실행하면 잠을 잔다. 분석 편의를 위해선 sleep을 1초로 고정하거나 패치하는 게 좋다.
그리고 if문 2개가 맞아야? get_flag를 준다고 합니다. 레츠고~~!!!
1. ida 세팅

저는 보통 VA로 맞춰주는데요?
리버싱에서 VA는 Virtual Address(가상 주소)의 약자로 이는 컴퓨터 프로그램이 실행될 때 CPU가 사용하는 메모리 주소를 의미합니다.
info proc mappings
해당 명령어를 사용하면 해당 명령어를 사용하면 현재 프로세스가 사용 중인 메모리 영역을 상세하게 보여줘요.
* pwndbg 글자가 초록색일 때 명령어 사용!

pwndbg에서의 main 주소를 IDA에서 Rebase해줘요.

주소를 넣고 OK를 누르면 세팅 완료!!!
1번째 if문의 구조

[ pwndbg 명령어 ]
b *0x주소 : 중단점 설정
bc : breakpoint clear 중단점 초기화
r : f9
n : f8
c : 프로그램 끝까지 진행
set $레지스터=값 : 레지스터에 값 설정
b *0x5555555552f6 → 중단점을 걸고 인자를 1초로 바꿔줘야 함!

set $eax=1 → 1초만 자도록 설정 후 n 명령어로 계속 진행 scanf부분에서 아무 값(전 3 입력했어요)이나 입력 후 계속 진행

5 -3을 볼 수 있는데 제가 입력한 값 3과 5를 비교하는 걸 볼 수 있는데 이때 첫 번째 if문의 rand값은 5임을 알 수 있다.

5인지 확인하고 넘어가기!
2번째 if문의 구조

cmp전인 mov에서 seconds를 볼 수 있는데 이 주소를 중단점 걸어준다.
b *0x0000555555555407 → 여기서도 값을 받는데 일단 아무값(2를 입력)이나 넣으면 1번째 if문과 같은 구조로 3 - 2로 출력되는데 이 때 두 번째 if문의 값은 3인 걸 알 수 있다.
set *0x7fffffffdd24=3 → 3으로 값을 설정하면 두 if문이 모두 True가 되었으므로 Flag값을 알 수 있다.
[ Flag ]

'Reversing > Dreamhack Write up' 카테고리의 다른 글
| [Dreamhack] Recover (0) | 2026.01.16 |
|---|---|
| [Dreamhack] Happy New Year! (0) | 2026.01.14 |
| [Dreamhack] Simple Crack Me Write up (0) | 2025.12.14 |
| [Dreamhack] rev-basic-4 Write up (1) | 2025.11.18 |
| [Dreamhack] rev-basic-3 Write up (0) | 2025.11.02 |