Reversing Basic Challenge #2
이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 correct 또는 wrong을 출력하는 프로그램이 주어집니다.
해당 바이너리를 분석하여 correct를 출력하는 입력값을 찾으세요!
획득한 입력값은 DH{} 포맷에 넣어서 인증해주세요.
예시) 입력 값이 Apple_Banana일 경우 flag는 DH{Apple_Banana}
main 함수 분석

- sub_140011B0 → prinf 함수
- sub_14001210 → scanf 함수
sub_140001000 → 입력값 검증함수

- 인자로 전달된 값 → a1
- 반복문을 0x12 = 18번 반복함
- if문의 조건이 성립하면 0을 반환, 성립하지 않고 18번 반복하면 1을 반환함
- 1이 반환되도록 하려면 *(unsigned __int8 *)(a1 + i)과 *(_DWORD *)&aC[4 * i]의 값이 동일해야함
- *(_DWORD *)&aC[4 * i] → 주소가 4씩 증가함을 볼 수 있음.

*(_DWORD *)&aC[4 * i]
1. aC[ 4*i ]
- aC는 배열 또는 포인터, 4*i는 인덱스
- ac배열에서 ( 4*i )번째 요소
2. &aC[4 * i]
- &aC[4 * i]의 주소를 가져옴
3. (_DWORD *)&aC[4 * i]
- &aC[4 * i]의 주소를 _DWORD * 형식으로 캐스팅함
- _DWORD → 4바이트 크기의 unsigned int
4. *(_DWORD *)&aC[4 * i]
- aC의 4 * i 위치에서 4바이트(32비트) 크기의 값을 읽음.
*(unsigned __int8 *)(a1 + i)
- a1 + i 는 문자열 a1의 i번째 문자 위치

- (a1 + i)를 unsigned__int8 즉 unsiged char *로 변환함
- unsigned __int8은 보통 1바이트(8비트) 크기를 가진다.
- a1[i] 값을 1바이트(unsigned char)로 가져옴.
결론
- Scanf로 입력된 문자열이 aC부터 4바이트 단위로 18번 읽은 문자열과 동일해야함.
'Reversing > Dreamhack : Reverse Engineering' 카테고리의 다른 글
| [Dreamhack] rev-basic-4 (0) | 2025.04.21 |
|---|---|
| [Dreamhack] rev-basic-3 (0) | 2025.04.21 |
| [Dreamhack] rev-basic-1 (0) | 2025.04.21 |
| [Dreamhack] rev-basic-0 (0) | 2025.04.21 |
| [Dreamhack] patch (0) | 2025.04.21 |