본문 바로가기

Reversing/Dreamhack : Reverse Engineering

[Dreamhack] rev-basic-8

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