int __fastcall main(int argc, const char **argv, const char **envp)
{
__int64 src[10]; // [rsp+0h] [rbp-F0h] BYREF
char dest[72]; // [rsp+A0h] [rbp-50h] BYREF
unsigned int i; // [rsp+ECh] [rbp-4h]
puts("---Counter---");
for ( i = 10; (int)i > 0; --i )
{
printf("%d\n", i);
if ( i == 3 )
{
strcpy((char *)src, "IM{508889j32j87j9jg54650840428hjhi2ii08h74ihj538h543j7g6k5jk8jih22f}");
memcpy(dest, src, 0x45uLL);
}
}
puts("---END---");
return 0;
}
이번 문제는 추가 함수가 main에 없다.
문제에서 flag_enc 함수를 실행시키라고 했으니 찾아보자.
_BYTE *__fastcall flag_gen(const char *a1, __int64 a2, int a3)
{
size_t v3; // rbx
_BYTE *result; // rax
char v6[64]; // [rsp+20h] [rbp-A0h]
char v7[32]; // [rsp+60h] [rbp-60h] BYREF
char v8[35]; // [rsp+80h] [rbp-40h] BYREF
char v9; // [rsp+A3h] [rbp-1Dh]
int j; // [rsp+A4h] [rbp-1Ch]
int i; // [rsp+A8h] [rbp-18h]
int v12; // [rsp+ACh] [rbp-14h]
strcpy(v8, "abcdefghijklmnopqrstuvwxyz");
strcpy(v7, "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
for ( i = 0; i <= 25; ++i )
{
v6[(a3 + i) % 26 + 32] = v8[i];
v6[(a3 + i) % 26] = v7[i];
}
v6[i + 32] = 0;
v6[i] = 0;
for ( j = 0; ; ++j )
{
v3 = j;
if ( v3 >= strlen(a1) )
break;
v9 = a1[j];
if ( ((*__ctype_b_loc())[v9] & 0x200) != 0 )
{
*(_BYTE *)(a2 + j) = v6[v9 - 65];
}
else if ( ((*__ctype_b_loc())[v9] & 0x100) != 0 )
{
*(_BYTE *)(a2 + j) = v6[v9 - 65];
}
else if ( ((*__ctype_b_loc())[v9] & 0x800) != 0 )
{
v12 = (a3 + 3) * v9 % 9;
if ( v12 <= 7 || v12 > 9 )
v12 += 50;
else
v12 += 40;
*(_BYTE *)(j + a2) = v12;
}
else
{
*(_BYTE *)(a2 + j) = v9;
}
}
result = (_BYTE *)(a2 + strlen(a1));
*result = 0;
return result;
}
flag_enc를 어디서 실행하는지 찾아보니

main에서 실행이 된다. 그런데 왜 디컴파일을 하면 c 코드에는 없을까?

var_4는 for문에서 i다. i가 0이 되면 for문을 빠져나오게 된다.
이후 5와 비교하여 5가 아니면 loc_15FE로 jmp하여 중간에 있는 코드(flag_enc 실행 코드)를 모두 건너뛰게 된다. 그러면 저 위치에서 i를 5로 바꿔주자.
