본문 바로가기

Reversing/Dreamhack : Reverse Engineering

[Dreamhack] rev-basic-5

Reversing Basic Challenge #5

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

 

sub_140001000 함수

  • 입력된 문자열이 인자로 전달되어 a1에 저장됨.
  • 반복문 0x18 = 24번 반복
  • byte_140003000 배열 값
    • AD D8 CB CB 9D 97 CB C4  92 A1 D2 D7 D2 D6 A8 A5 DC C7 AD A3 A1 98 4C → 23개
      마지막 00 
      AD D8 CB CB 9D 97 CB C4  92 A1 D2 D7 D2 D6 A8 A5 DC C7 AD A3 A1 98 4C 00→ 총 24개
  • if 조건문 → a1[i+1] + a1[i]값이 byte_140003000 배열 값과 동일하면 1 리턴함.

 

a1 구하기

  • a1[i+1] + a1[i] = byte_140003000[i]
  • → a1[i] = byte_140003000[i] - a1[i+1]
  • 마지막이 0이므로 뒤에서부터 하나씩 구할 수 있을 것으로 보인다.
#include<stdio.h>
int main(){
        int byte[] = {
                0xAD, 0xD8, 0xCB, 0xCB, 0x9D,
                0x97, 0xCB, 0xC4, 0x92, 0xA1,
                0xD2, 0xD7, 0xD2, 0xD6, 0xA8,
                0xA5, 0xDC, 0xC7, 0xAD, 0xA3,
                0xA1, 0x98, 0x4C, 0x0
                };
        int input[24];
        int last = 0;

        int i;
        for (i=23 ; 0<=i ; i--){
                last = byte[i] - last;
                input[i] = last;
        }

        printf("Flag is DH{");
        for (i=0 ; i <24 ; i++){
                printf("%c", input[i]);
        }
        printf("}");

        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-4  (0) 2025.04.21
[Dreamhack] rev-basic-3  (0) 2025.04.21
[Dreamhack] rev-basic-2  (0) 2025.04.21