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

- 0x15 → 21
- byte_14000300
AC F3 0C 25 A3 10 B7 25 16 C6 B7 BC 07 25 02 D5 C6 11 07 C5
(unsigned __int8)(-5 * *(_BYTE *)(a1 + i))
1. (-5) * a1[i] 연산
- a1[i]가 unsigned char일 때, 이를 -5와 곱하면 정수 확장이 발생
- C에서 unsigned char는 1바이트(0~255)이지만, 산술 연산 시에는 자동으로 int(32비트)로 확장됨.
2. (unsigned __int8) 형 변환
- (unsigned __int8)(-5 * a1[i])에서 5 * a1[i]의 결과가 int 타입으로 확장된 후,
- 최종적으로 unsigned __int8(0~255 범위)로 강제 변환됨.
- 이는 하위 8비트만 유지한다는 의미
- _BYTE → 부호가 없는 1바이트 == unsigned char
a1 구하기
- 역연산할 수 있는 방법이 없음
- brute force를 이용해 구해야함.
#include <stdio.h>
#include <stdint.h>
int main() {
unsigned char byte_140003000[21] = {
0xAC, 0xF3, 0x0C, 0x25, 0xA3, 0x10, 0xB7, 0x25,
0x16, 0xC6, 0xB7, 0xBC, 0x07, 0x25, 0x02, 0xD5,
0xC6, 0x11, 0x07, 0xC5
};
char a1[22] = {0}; //
for (int i = 0; i < 21; ++i) {
for (int j = 32; j <= 126; ++j) {
unsigned char computed = (unsigned char)(-5 * j);
if (computed == byte_140003000[i]) {
a1[i] = (char)j;
break;
}
}
}
a1[21] = '\0'; // 문자열 종료
printf("Flag : DH{%s}\n", a1);
return 0;
}

'Reversing > Dreamhack : Reverse Engineering' 카테고리의 다른 글
| [Dreamhack] rev-basic-7 (0) | 2025.04.21 |
|---|---|
| [Dreamhack] rev-basic-6 (0) | 2025.04.21 |
| [Dreamhack] rev-basic-5 (0) | 2025.04.21 |
| [Dreamhack] rev-basic-4 (0) | 2025.04.21 |
| [Dreamhack] rev-basic-3 (0) | 2025.04.21 |