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

    답글 남기기

    이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다