Exeinfo PE
Decompiled-src
wmain
__int64 wmain() { unsigned int v0; // eax __int64 i; // rbx char v2; // r8 int v3; // edx __int64 v4; // rcx _BYTE *v5; // rdx __int64 v6; // rcx char v7; // al int v8; // ecx __int16 *v9; // rdx __int16 v10; // ax __int16 v11; // ax int v13; // [rsp+40h] [rbp-78h] BYREF int v14; // [rsp+44h] [rbp-74h] BYREF int v15; // [rsp+48h] [rbp-70h] BYREF int v16; // [rsp+4Ch] [rbp-6Ch] BYREF int v17; // [rsp+50h] [rbp-68h] BYREF int v18; // [rsp+54h] [rbp-64h] BYREF int v19[3]; // [rsp+58h] [rbp-60h] int v20; // [rsp+64h] [rbp-54h] int v21; // [rsp+68h] [rbp-50h] int v22; // [rsp+6Ch] [rbp-4Ch] __int16 v23[25]; // [rsp+70h] [rbp-48h] BYREF __int16 v24; // [rsp+A2h] [rbp-16h] v13 = 0; v14 = 0; v15 = 0; v16 = 0; v17 = 0; v18 = 0; v19[0] = 0; v19[1] = 0; v19[2] = 0; v20 = 0; v21 = 0; v22 = 0; v0 = time64(0i64); srand(v0); do { wprintf(L"\n\t\tL O T T O\t\t\n\n"); wprintf(L"Input the number: "); wscanf_s(L"%d %d %d %d %d %d", &v13, &v14, &v15, &v16, &v17, &v18); wsystem(L"cls"); Sleep(0x1F4u); for ( i = 0i64; i < 6; v19[i - 1] = rand() % 100 ) ++i; v2 = 1; v3 = 0; v4 = 0i64; byte_7FF622EB35F0 = 1; while ( v19[v4] == *(int *)((char *)&v13 + v4 * 4) ) { ++v4; ++v3; if ( v4 >= 6 ) goto LABEL_9; } v2 = 0; byte_7FF622EB35F0 = 0; LABEL_9: ; } while ( v3 != 6 ); v5 = byte_7FF622EB3021; v23[1] = 92; v23[0] = 184; v23[2] = 139; v23[5] = 184; v23[3] = 107; v6 = 0i64; v23[4] = 66; v23[6] = 56; v23[7] = 237; v23[8] = 219; v23[9] = 91; v23[10] = 129; v23[11] = 41; v23[12] = 160; v23[13] = 126; v23[14] = 80; v23[15] = 140; v23[16] = 27; v23[17] = 134; v23[18] = 245; v23[19] = 2; v23[20] = 85; v23[21] = 33; v23[22] = 12; v23[23] = 14; v23[24] = 242; v24 = 0; do { v7 = byte_7FF622EB3021[v6 - 1]; v6 += 5i64; *((_WORD *)&v20 + v6 + 1) ^= (unsigned __int8)(v7 - 12); *((_WORD *)&v21 + v6) ^= (unsigned __int8)(byte_7FF622EB3021[v6 - 5] - 12); *((_WORD *)&v21 + v6 + 1) ^= (unsigned __int8)(byte_7FF622EB3021[v6 - 4] - 12); v23[v6 - 2] ^= (unsigned __int8)(byte_7FF622EB3021[v6 - 3] - 12); v23[v6 - 1] ^= (unsigned __int8)(byte_7FF622EB3021[v6 - 2] - 12); } while ( v6 < 25 ); if ( v2 ) { v8 = 0; v9 = v23; do { v10 = *v9++; v11 = v8++ + (v10 ^ 0xF); *(v9 - 1) = v11; } while ( v8 < 25 ); v24 = 0; wprintf(L"%s\n", v23); } wprintf(L"\n", v5); return 1i64; }
6개의 수를 입력받아 랜덤인 수를 맞춰 통과했을 경우,
XOR 복호화를 하여 printf 함수를 통해 출력해주는 것으로 보인다.
Solution
.text:0000000140001138 주소에 있는
xor r8b, r8b 명령어를 mov r8b, 1로 패치
.text:0000000140001145 주소에 있는
jnz loc_7FF622EB1070 명령어에 의해 분기되지 않도록 nop으로 패치
위 2가지 패치를 하면
랜덤인 수와 맞지 않더라도 통과할 수 있다.
Result
FLAG
from_GHL2_-_!