콘텐츠로 건너뛰기

x64 Lotto

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_-_!

태그:

답글 남기기