https://dreamhack.io/wargame/challenges/18
Reversing Basic Challenge #4
이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 correct 또는 wrong을 출력하는 프로그램이 주어집니다.
해당 바이너리를 분석하여 correct를 출력하는 입력값을 알아내세요.
획득한 입력값은 DH{} 포맷에 넣어서 인증해주세요.
예시) 입력 값이 Apple_Banana일 경우 flag는 DH{Apple_Banana}
.exe 파일을 IDA를 이용해 디컴파일 해줍니다. (f5)
if ( (unsigned int)sub_140001000(v4) )
sub_140001000(v4)
이 함수는 입력값이 참인지 거짓인지 검사하는 함수입니다.
2. 위 함수를 더블클릭해 더 자세히 알아봅니다.

for ( i = 0; (unsigned __int64)i < 0x1C; ++i )
if ( ((unsigned __int8)(16 * *(_BYTE *)(a1 + i))
| ((int)*(unsigned __int8 *)(a1 + i) >> 4))
!= byte_140003000[i] )
*(_BYTE *)(a1 + i) = input[i] 이므로, 전체를 치환.(보기 편하게)(_BYTE *) → 1바이트로 보겠다a1 = 문자열 시작 주소((unsigned __int8)(16 * input[i]) | (input[i] >> 4))
16 * input[i] : 왼족으로 4칸 이동.input[i] >> 4 : 오른쪽으로 4비트 이동| : 두 결과를 합침byte_140003000[i] 와 비교해야 함!byte_140003000[i]를 찾습니다.
0000000140003000 24 27 13 C6 C6 13 16 E6 47 F5 26 96 47 F5 46 27 $'........&.G...
0000000140003010 13 26 26 C6 56 F5 C3 C3 F5 E3 E3 00 00 00 00 00 .&&.............
전체 데이터 : 24 27 13 C6 C6 13 16 E6 47 F5 26 96 47 F5 46 27
13 26 26 C6 56 F5 C3 C3 F5 E3 E3
입력값을 뒤집습니다.
| 원본 | 변환 |
|---|---|
| 24 | 42 (B) |
| 27 | 72 (r) |
| 13 | 31 (1) |
| C6 | 6C (l) |
| C6 | 6C (l) |
| 13 | 31 (1) |
| 16 | 61 (a) |
| E6 | 6E (n) |
| 47 | 74 (t) |
| F5 | 5F (_) |
| 26 | 62 (b) |
| 96 | 69 (i) |
| 47 | 74 (t) |
| F5 | 5F (_) |
| 46 | 64 (d) |
| 27 | 72 (r) |
| 13 | 31 (1) |
| 26 | 62 (b) |
| 26 | 62 (b) |
| C6 | 6C (l) |
| 56 | 65 (e) |
| F5 | 5F (_) |
| C3 | 3C (<) |
| C3 | 3C (<) |
| F5 | 5F (_) |
| E3 | 3E (>) |
| E3 | 3E (>) |
-> 최종 문자열 : Br1ll1ant_bit_dr1bble_<<_>>
