BruteForce is Wonderful!

2018. 4. 2. 03:510x02 Reverse Engineer/0x03. Etc

728x90

예전에 멘토형(yyt3000)이 해당 문제를 주었을 땐 노가다로 풀었었는데 댕이댕이님의 블로그에서 이 문제를 또 발견 하여 이번엔 코드로 작성해서 풀어보았다. 


[바이너리] :  08.exe



조건은 다음과 같다.



#include <stdio.h>

#include <string.h>

#include <Windows.h>


// condition

// arr[0] & 0xAD == 0 // arr_index0

// arr[1] & 0x9A == 0 // arr_index1

// arr[2] & 0x97 == 0 // arr_index2

// arr[3] & 0xbf == 0 // arr_index3

// arr[4] & 0x5FC5 == 0 // arr_index4

// arr[5] & 0xD6 == 0 // arr_index5



char arr[] = "";

static int arr_index = 0;

void check_routine();

void get_flag(int, int );

void make_ascii(char *);


int main(int argc, char*argv[])

{

make_ascii(arr);

check_routine();

}


void make_ascii(char *arr)

{

// 아스키코드 0x21 ~ 0x7E

int val = 0x21;

for (int i = 0x0; val <= 0x7e; i++)

{

arr[i] = val;

val++;

}

}


void check_routine()

{

printf("연산중..답은 하나가 아닐 것이다..\n");

printf("testing ... %s\n", arr);

get_flag(0, 0);

}


void get_flag(int arr_index, int index)

{

char check[] = { 0xAD,0x9a,0x97,0xbf,0xc5,0xd6 }; // 연산에 쓰이는 아이들

int result = arr[arr_index] & check[index];

if ( result == 0 && index<6)

{

printf("%d번째 플래그에 올 수 있는 것 : %c(0x%x)\n", index, arr[arr_index], arr[arr_index]);

arr_index++;

}

else

{

++arr_index;

}

if (arr_index == 94)

{

MessageBoxA(NULL, "다음 배열을 살펴봅시다", "", MB_OK);

printf("\n");

index++;

arr_index = 0;

}

if (index == 6)

exit(0);

get_flag(arr_index, index);

}



결과는 아주 많이 나오게 된다 ^.^ 이런식의 유형은 CTF에서 내면 큰일날 것 같다. 

'0x02 Reverse Engineer > 0x03. Etc' 카테고리의 다른 글

Rootme ch25 C++ Basic  (0) 2018.05.03
Simple Crack Me Writeup  (0) 2018.04.28
XOR IT'S FUN  (0) 2018.04.02
예전에 풀었던 Abex을 키젠 으로 다시 풀기  (0) 2018.03.15
2018 해킹캠프문제 2  (0) 2018.01.13