본문 바로가기

Reversing/Dreamhack : Reverse Engineering

[Dreamhack] rev-basic-7

Reversing Basic Challenge #7

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

 

sub_140001000 함수

  • 0x1F = 31 → 반복문 31번 반복 → 입력값이 31글자
  • byte_140003000
    • 52 DF B3 60 F1 8B 1C B5 57 D1 9F 38 4B 29 D9 26 7F C9 A3 E9 53 18 4F B8 6A CB 87 58 5B 39 1E

 

 

(i ^ (unsigned __int8)ROL1(*(_BYTE *)(a1 + i), i & 7))

 

1. *(_BYTE *)(a1 + i)

  • a1[i]와 동일

2. ROL1(*(_BYTE *)(a1 + i), i & 7)

 

[ 비트 회전 (Rotate Left) ]

__ROL1__(x, shift)는 x를 왼쪽으로 shift 비트만큼 회전하는 연산

10110011  -> (왼쪽 3비트 회전)
10011101

 

  • i & 7
      • i 값을 7(= 0b111)과 AND 연산하여 0~7 사이의 값을 얻음
  • __ROL1__(x, i & 7)는 해당 바이트 값을 0~7비트 범위 내에서 회전하는 것

↓↓

 

(i ^ (unsigned __int8)__ROL1__(*(_BYTE *)(a1 + i), i & 7))는

  1. a1 + i에서 1바이트 데이터를 가져오고,
  2. 해당 바이트를 i & 7 비트만큼 왼쪽 회전한 뒤,
  3. 그 결과를 i와 XOR 연산하는 것

 

a1 구하기

  • 주어진 byte_140003000[i]는 i ^ ROL1(a1[i], i & 7)의 결과
  • 역연산
#include <stdio.h>
#include <stdint.h>

unsigned char ror1(unsigned char value, int shift) {
    return (value >> shift) | (value << (8 - shift));
}

int main() {
    unsigned char byte_140003000[31] = {  // 1바이트 크기로 선언
        0x52, 0xDF, 0xB3, 0x60, 0xF1, 0x8B, 0x1C, 0xB5, 
        0x57, 0xD1, 0x9F, 0x38, 0x4B, 0x29, 0xD9, 0x26, 
        0x7F, 0xC9, 0xA3, 0xE9, 0x53, 0x18, 0x4F, 0xB8, 
        0x6A, 0xCB, 0x87, 0x58, 0x5B, 0x39, 0x1E
    };

    char a1[32] = {0}; // 문자열 저장할 배열

    for (int i = 0; i < 31; ++i) {
        a1[i] = (char)ror1((unsigned char)(i ^ byte_140003000[i]), i & 7); 
    }

    a1[31] = '\0'; // 문자열 종료

    printf("Flag: DH{%s}\n", a1);

    return 0;
}



'Reversing > Dreamhack : Reverse Engineering' 카테고리의 다른 글

[Dreamhack] rev-basic-8  (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