2018. 4. 2. 03:51ㆍ0x02 Reverse Engineer/0x03. Etc
예전에 멘토형(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 |