Link: https://forum.tuts4you.com/topic/37666-crackme-find-the-flag-by-extremecoders/
Cái crackme này lúc đầu download về, cho vào IDA analyse, nhìn đống messy code xong thấy ngơ luôn, như kiểu thanh niên ngáo đá muốn phá đảo thế giới ảo ….. Sau đọc được bài write-up của kao (http://lifeinhex.com/solving-find-the-flag-crackme-by-extreme-coders/), thấy dị dị nên note lại. .
Load crackme vào IDA, quan sát code tại _main
thấy như sau:
Tiến hành debug, dừng lại tại bp, quan sát thấy vùng code đã được giải mã như sau:
Cuộn chuột xuống dưới để xem code đã được giải mã hết chưa thì lại bắt gặp vòng lặp xor nữa và vùng code bị encrypted ở dưới còn rất nhiều:
Việc đặt BP để decrypt code bằng tay sẽ mất nhiều thời gian và không hiệu quả. Cách hiệu quả nhất là dùng script để thực hiện việc giải mã một cách tự động. Script thực hiện quá trình giải mã như sau:
/* IDC Script: this script automate decrypt all encrypted code */ //declare local variables auto ea; auto addr; auto size; auto xorval; auto x; auto b; ea = MinEA(); //set ea to the lowest address used in the program (ea = 401000h) ea = FindBinary(ea, SEARCH_DOWN , "E8 00 00 00 00 5E 81 C6"); // search for the specified byte. If not found return BADADDR. Ex: First found at 40103Bh while (ea != BADADDR) { addr = ea + 5 + 0x16; //get adrr of encrypted code (ex: addr = 40103Bh + 5 + 0x16 = 401056h) size = Dword(ea + 0xD); //get size of encrypted code at ea (40103Bh), ex: size = 204h xorval = Byte(ea + 0x15); //get xor key, ex: xorval = 86h Message(form("Encrypted code parameters: start=%x size=%x key=%x\n", addr, size, xorval)); for (x=0; x<size; x++) { b = Byte(addr + x); PatchByte(addr + x, b^xorval); } ea = FindBinary(ea +1, SEARCH_DOWN, "E8 00 00 00 00 5E 81 C6"); //next found, ex: ea = 401277h }
Toàn bộ đoạn script trên thực hiện việc tìm kiếm vùng code liên quan đến việc giải mã, sau đó trích xuất các thông tin liên quan tới vùng code bị encrypted, gồm địa chỉ (ea
), kích thước (size
), key mã hóa (xorval
). Sau khi có đủ thông tin, thực hiện việc giải mã.
Để thực thi script, reanalyse lại crackme trong IDA, tại _main
nhấn Shift-F2
, nhập script và cho thực thi:
Sau khi toàn bộ code đã được giải mã xong, thực hiện tái tạo lại hàm _main
do ban đầu đã bị sai: .text:00401056 _main endp ; sp-analysis failed
.
Phân tích sơ bộ và đặt tên lại một số biến, ta có được thông tin sau:
Sau đó Flag nhập vào sẽ được sử dung để tính toán và so sánh, ví dụ như các đoạn code sau:
v12 = 0x88; do { --v12; *(_BYTE *)(v12 + 0x401333) ^= 0x26u; } while ( v12 ); size_EncryptCode4 = 0x88; do { --size_EncryptCode4; *(_BYTE *)(size_EncryptCode4 + 0x4013F3) ^= 0x8Eu; } while ( size_EncryptCode4 ); if ( enteredString[0] + enteredString[22] + enteredString[23] + enteredString[26] + enteredString[14] + enteredString[24] + enteredString[17] + enteredString[12] + enteredString[10] + enteredString[15] + enteredString[4] + enteredString[2] + enteredString[6] + enteredString[1] + enteredString[29] + enteredString[11] + 2 * (enteredString[9] + enteredString[19]) == 1927 ) ++iResult; v14 = 0x88; do { --v14; *(_BYTE *)(v14 + 0x4013F3) ^= 0x8Eu; } while ( v14 ); size_EncryptCode5 = 0x17; do { --size_EncryptCode5; *(_BYTE *)(size_EncryptCode5 + 0x4014B3) ^= 0x29u; } while ( size_EncryptCode5 );
Tóm lại, đếm sơ sơ thì có khoảng gần 100 vùng code tính toán và kiểm tra kiểu như trên. Lẫn lộn trong đống code này là các đoạn code chịu trách nhiệm encryp/decrypt.
Toàn bộ code có được của hàm _main
bằng HexRays:
int __cdecl main(int argc, const char **argv, const char **envp) { FILE *v3; // eax@1 HMODULE handle_kernel32; // eax@1 FARPROC addr_Sleep; // esi@1 signed int iResult; // eax@1 char enteredString[32]; // [sp+10h] [bp-A0h]@1 char ProcName[6]; // [sp+30h] [bp-80h]@1 char ModuleName[9]; // [sp+38h] [bp-78h]@1 char def_string2[17]; // [sp+44h] [bp-6Ch]@1 char def_string1[61]; // [sp+58h] [bp-58h]@1 char v13; // [sp+95h] [bp-1Bh]@1 char str_Result_Msg[19]; // [sp+98h] [bp-18h]@201 *(_DWORD *)enteredString = 0; *(_DWORD *)&enteredString[4] = 0; *(_DWORD *)&enteredString[8] = 0; *(_DWORD *)&enteredString[12] = 0; *(_DWORD *)&enteredString[16] = 0; *(_DWORD *)&enteredString[20] = 0; *(_DWORD *)&enteredString[24] = 0; *(_DWORD *)&enteredString[28] = 0; def_string1[0] = '-'; def_string1[1] = '-'; def_string1[2] = '-'; def_string1[3] = '-'; def_string1[4] = '-'; def_string1[5] = '-'; def_string1[6] = '-'; def_string1[7] = '-'; def_string1[8] = '-'; def_string1[9] = '-'; def_string1[51] = '-'; def_string1[52] = '-'; def_string1[53] = '-'; def_string1[54] = '-'; def_string1[55] = '-'; def_string1[56] = '-'; def_string1[57] = '-'; def_string1[58] = '-'; def_string1[59] = '-'; def_string1[60] = '-'; def_string1[10] = 'F'; def_string1[11] = 'i'; def_string1[12] = 'n'; def_string1[13] = 'd'; def_string1[14] = ' '; def_string1[15] = 't'; def_string1[16] = 'h'; def_string1[17] = 'e'; def_string1[18] = ' '; def_string1[19] = 'f'; def_string1[20] = 'l'; def_string1[21] = 'a'; def_string1[22] = 'g'; def_string1[23] = ':'; def_string1[24] = ' '; def_string1[25] = 'B'; def_string1[26] = 'y'; def_string1[27] = ' '; def_string1[28] = 'E'; def_string1[29] = 'x'; def_string1[30] = 't'; def_string1[31] = 'r'; def_string1[32] = 'e'; def_string1[33] = 'm'; def_string1[34] = 'e'; def_string1[35] = 'C'; def_string1[36] = 'o'; def_string1[37] = 'd'; def_string1[38] = 'e'; def_string1[39] = 'r'; def_string1[40] = 's'; def_string1[41] = ','; def_string1[42] = ' '; def_string1[43] = 'N'; def_string1[44] = 'o'; def_string1[45] = 'v'; def_string1[46] = ' '; def_string1[47] = '2'; def_string1[48] = '0'; def_string1[49] = '1'; def_string1[50] = '5'; v13 = '\0'; puts(def_string1); puts("\n\n"); def_string2[0] = 'E'; def_string2[1] = 'n'; def_string2[2] = 't'; def_string2[3] = 'e'; def_string2[4] = 'r'; def_string2[5] = ' '; def_string2[6] = 'y'; def_string2[7] = 'o'; def_string2[8] = 'u'; def_string2[9] = 'r'; def_string2[10] = ' '; def_string2[11] = 'f'; def_string2[12] = 'l'; def_string2[13] = 'a'; def_string2[14] = 'g'; def_string2[15] = ':'; def_string2[16] = '\0'; puts(def_string2); puts("\n"); v3 = (FILE *)sub_404DF4(); fgets(enteredString, 31, v3); ModuleName[0] = 'k'; ModuleName[1] = 'e'; ModuleName[2] = 'r'; ModuleName[3] = 'n'; ModuleName[4] = 'e'; ModuleName[5] = 'l'; ModuleName[6] = '3'; ModuleName[7] = '2'; ModuleName[8] = '\0'; handle_kernel32 = GetModuleHandleA(ModuleName); ProcName[0] = 'S'; ProcName[1] = 'l'; ProcName[2] = 'e'; ProcName[3] = 'e'; ProcName[4] = 'p'; ProcName[5] = '\0'; addr_Sleep = GetProcAddress(handle_kernel32, ProcName); ((void (__stdcall *)(signed int))addr_Sleep)(750); iResult = 0; if ( enteredString[0] + enteredString[22] + enteredString[26] + enteredString[20] + enteredString[10] + enteredString[7] + 3 * enteredString[14] + 2 * (enteredString[23] + enteredString[24] + enteredString[17] + enteredString[21] + enteredString[12] + enteredString[18]) == 2024 ) iResult = 1; if ( enteredString[0] + enteredString[22] + enteredString[23] + enteredString[26] + enteredString[14] + enteredString[24] + enteredString[17] + enteredString[12] + enteredString[10] + enteredString[15] + enteredString[4] + enteredString[2] + enteredString[6] + enteredString[1] + enteredString[29] + enteredString[11] + 2 * (enteredString[9] + enteredString[19]) == 1927 ) ++iResult; if ( enteredString[14] + enteredString[10] == 148 ) ++iResult; if ( enteredString[0] + enteredString[14] + enteredString[10] + enteredString[11] + enteredString[3] + enteredString[25] + 2 * (enteredString[22] + enteredString[27]) == 741 ) ++iResult; if ( enteredString[24] + enteredString[29] == 229 ) ++iResult; if ( enteredString[0] + enteredString[26] + enteredString[20] + enteredString[21] + enteredString[12] + enteredString[7] + enteredString[9] + enteredString[15] + enteredString[4] + enteredString[1] + enteredString[29] + enteredString[11] + enteredString[3] + enteredString[27] + enteredString[25] + enteredString[5] + enteredString[8] + enteredString[16] + 2 * (enteredString[6] + enteredString[19]) == 2133 ) ++iResult; if ( enteredString[14] + enteredString[17] + enteredString[7] + enteredString[15] + enteredString[11] + enteredString[8] == 619 ) ++iResult; if ( enteredString[0] + enteredString[22] + enteredString[26] + enteredString[21] + enteredString[12] + enteredString[7] + enteredString[11] + enteredString[16] + enteredString[28] + 2 * enteredString[23] == 996 ) ++iResult; if ( enteredString[24] + enteredString[17] + enteredString[6] + enteredString[1] + enteredString[29] + 2 * enteredString[21] == 717 ) ++iResult; if ( enteredString[24] + enteredString[21] + enteredString[12] + enteredString[18] + enteredString[6] + enteredString[29] + enteredString[11] + enteredString[8] + enteredString[16] + 3 * enteredString[26] + 2 * (enteredString[0] + enteredString[17] + enteredString[2] + enteredString[19] + enteredString[5] + enteredString[28] + enteredString[13]) == 2308 ) ++iResult; if ( enteredString[20] + enteredString[17] + enteredString[21] + enteredString[7] + enteredString[9] + enteredString[1] + enteredString[19] + enteredString[11] + enteredString[27] + enteredString[8] + enteredString[28] + 3 * (enteredString[14] + enteredString[3]) + 2 * (enteredString[0] + enteredString[23] + enteredString[18] + enteredString[6]) == 2347 ) ++iResult; if ( enteredString[0] + enteredString[26] + enteredString[20] + enteredString[24] + enteredString[10] + enteredString[9] + enteredString[6] + enteredString[11] + enteredString[25] + 2 * (enteredString[23] + enteredString[28]) == 1041 ) ++iResult; if ( enteredString[23] + enteredString[6] + enteredString[27] == 184 ) ++iResult; if ( enteredString[23] + enteredString[18] + enteredString[9] + enteredString[19] + enteredString[11] + enteredString[25] + enteredString[5] + enteredString[16] + 2 * enteredString[1] == 1076 ) ++iResult; if ( enteredString[0] + enteredString[22] + enteredString[26] + enteredString[20] + enteredString[24] + enteredString[10] + enteredString[7] + enteredString[4] + enteredString[2] + enteredString[6] + enteredString[19] + enteredString[11] == 1040 ) ++iResult; if ( enteredString[0] + enteredString[22] + enteredString[23] + enteredString[14] + enteredString[18] + enteredString[10] + enteredString[4] + enteredString[6] + enteredString[1] + enteredString[19] + enteredString[11] + enteredString[8] + enteredString[16] + enteredString[28] + 5 * enteredString[21] + 3 * enteredString[13] + 2 * (enteredString[26] + enteredString[24]) == 2393 ) ++iResult; if ( enteredString[0] + enteredString[23] + enteredString[26] + enteredString[24] + enteredString[9] + enteredString[15] + enteredString[29] + enteredString[11] + enteredString[25] == 901 ) ++iResult; if ( enteredString[0] + enteredString[22] + enteredString[18] + enteredString[10] + enteredString[7] + enteredString[9] + enteredString[29] + enteredString[11] + enteredString[28] + 3 * enteredString[26] == 893 ) ++iResult; if ( enteredString[18] + enteredString[11] + enteredString[3] == 308 ) ++iResult; if ( enteredString[22] + enteredString[14] + enteredString[20] + enteredString[12] + enteredString[10] + enteredString[4] + enteredString[2] + enteredString[19] + enteredString[29] + enteredString[5] + enteredString[8] + enteredString[13] + 2 * enteredString[18] == 1350 ) ++iResult; if ( enteredString[0] + enteredString[26] + enteredString[14] + enteredString[20] + enteredString[17] + enteredString[7] + enteredString[9] + enteredString[1] + enteredString[19] + enteredString[5] + enteredString[8] + 2 * (enteredString[15] + enteredString[29] + enteredString[28]) == 0x62C ) ++iResult; if ( enteredString[14] + enteredString[20] + enteredString[24] + enteredString[12] + enteredString[18] + enteredString[10] + enteredString[15] + enteredString[6] + enteredString[29] + enteredString[3] + enteredString[25] + 3 * enteredString[21] + 2 * (enteredString[0] + enteredString[7] + enteredString[4]) == 0x81B ) ++iResult; if ( enteredString[23] + enteredString[26] + enteredString[24] + enteredString[17] + enteredString[21] + enteredString[18] + enteredString[10] + enteredString[6] + enteredString[11] + enteredString[5] + enteredString[8] + enteredString[13] + 3 * enteredString[22] + 2 * (enteredString[7] + enteredString[9] + enteredString[27]) == 0x6B9 ) ++iResult; if ( enteredString[11] + enteredString[28] == 141 ) ++iResult; if ( enteredString[26] + enteredString[24] + enteredString[17] + enteredString[12] + enteredString[7] + enteredString[4] + enteredString[29] + enteredString[5] + enteredString[16] + enteredString[13] + 2 * (enteredString[22] + enteredString[15] + enteredString[25]) == 0x60E ) ++iResult; if ( enteredString[0] + enteredString[22] + enteredString[20] + enteredString[17] + enteredString[18] + enteredString[15] + enteredString[2] + enteredString[1] + enteredString[19] + enteredString[27] + enteredString[5] + enteredString[16] + enteredString[13] + 2 * (enteredString[14] + enteredString[24] + enteredString[10] + enteredString[7] + enteredString[6] + enteredString[11] + enteredString[25]) == 0x9B4 ) ++iResult; if ( enteredString[22] + enteredString[17] + enteredString[10] + enteredString[5] + enteredString[16] + 2 * (enteredString[20] + enteredString[24]) == 0x324 ) ++iResult; if ( enteredString[7] + enteredString[4] + enteredString[2] + enteredString[27] + enteredString[25] + enteredString[5] + enteredString[8] + enteredString[16] + enteredString[13] + 3 * (enteredString[22] + enteredString[24] + enteredString[9]) + 2 * (enteredString[0] + enteredString[1] + enteredString[28] + 2 * enteredString[10]) == 0x941 ) ++iResult; if ( enteredString[23] + enteredString[17] + enteredString[12] + enteredString[27] + enteredString[16] + 2 * enteredString[9] == 0x2C0 ) ++iResult; if ( enteredString[0] + enteredString[26] + enteredString[24] + enteredString[10] + enteredString[7] + enteredString[4] + enteredString[6] + enteredString[1] + enteredString[29] + enteredString[11] + enteredString[3] + enteredString[27] + enteredString[5] + enteredString[8] + enteredString[13] + 3 * enteredString[20] + 2 * (enteredString[22] + enteredString[14] + enteredString[15]) == 0x83E ) ++iResult; if ( enteredString[26] + enteredString[14] + enteredString[21] + enteredString[18] + enteredString[9] + enteredString[15] + enteredString[2] + enteredString[29] + enteredString[3] + enteredString[5] == 968 ) ++iResult; if ( enteredString[24] + enteredString[12] + enteredString[4] + enteredString[1] + enteredString[19] + enteredString[3] + enteredString[16] + 2 * (enteredString[26] + enteredString[21] + enteredString[6] + enteredString[5]) == 1356 ) ++iResult; if ( enteredString[0] + enteredString[22] + enteredString[21] + enteredString[9] + enteredString[15] + enteredString[29] + enteredString[3] + enteredString[5] + 3 * enteredString[23] + 2 * (enteredString[12] + enteredString[7] + enteredString[19] + enteredString[27]) == 0x74D ) ++iResult; if ( enteredString[26] + enteredString[14] + enteredString[18] + enteredString[7] + enteredString[9] + enteredString[2] + enteredString[1] + enteredString[3] + enteredString[5] + enteredString[8] + enteredString[28] + 2 * (enteredString[0] + enteredString[20] + enteredString[17] + enteredString[21] + enteredString[15] + enteredString[6] + enteredString[19] + enteredString[25] + enteredString[13]) == 2769 ) ++iResult; if ( enteredString[22] + enteredString[23] + enteredString[10] + enteredString[15] + enteredString[19] + enteredString[11] + enteredString[8] + enteredString[28] + 2 * (enteredString[0] + enteredString[24] + enteredString[1] + enteredString[3] + enteredString[27] + 2 * (enteredString[26] + enteredString[7])) == 2147 ) ++iResult; if ( enteredString[23] + enteredString[14] + enteredString[20] + enteredString[24] + enteredString[17] + enteredString[19] + enteredString[11] + enteredString[3] + enteredString[25] + enteredString[13] + 2 * (enteredString[0] + enteredString[21] + enteredString[9] + enteredString[2] + enteredString[6] + enteredString[1] + enteredString[16]) == 2450 ) ++iResult; if ( enteredString[0] + enteredString[26] + enteredString[24] + enteredString[17] + enteredString[21] + enteredString[18] + enteredString[10] + enteredString[9] + enteredString[19] + enteredString[27] + enteredString[25] + 3 * (enteredString[11] + enteredString[13]) + 2 * (enteredString[12] + enteredString[28] + 2 * (enteredString[1] + enteredString[3])) == 2755 ) ++iResult; if ( enteredString[0] + enteredString[23] + enteredString[26] + enteredString[20] + enteredString[21] + enteredString[12] + enteredString[7] + enteredString[9] + enteredString[2] + enteredString[1] + enteredString[11] + enteredString[5] + enteredString[16] + 3 * (enteredString[6] + enteredString[25]) + 2 * (enteredString[24] + enteredString[18] + enteredString[10] + enteredString[15] + enteredString[28]) == 2561 ) ++iResult; if ( enteredString[21] + enteredString[4] + enteredString[19] + enteredString[5] + 2 * enteredString[14] == 642 ) ++iResult; if ( enteredString[20] + enteredString[24] + enteredString[17] + enteredString[4] + enteredString[27] + enteredString[25] + enteredString[8] + enteredString[16] + 3 * enteredString[19] + 2 * (enteredString[26] + enteredString[14] + enteredString[7] + enteredString[13] + 2 * enteredString[29]) == 0x920 ) ++iResult; if ( enteredString[20] + enteredString[24] + enteredString[12] + enteredString[18] + enteredString[10] + 3 * enteredString[3] + 2 * (enteredString[17] + enteredString[21] + enteredString[9] + enteredString[15] + enteredString[2] + enteredString[1] + enteredString[19] + enteredString[29] + enteredString[11] + enteredString[8]) == 2925 ) ++iResult; if ( enteredString[23] + enteredString[20] + enteredString[24] + enteredString[10] + enteredString[15] + enteredString[6] + enteredString[19] + enteredString[29] + enteredString[3] + enteredString[8] + enteredString[16] + enteredString[28] + 3 * enteredString[7] + 2 * (enteredString[14] + enteredString[17] + enteredString[12] + enteredString[9] + enteredString[1] + enteredString[25] + enteredString[13]) == 2956 ) ++iResult; if ( enteredString[22] + enteredString[26] + enteredString[24] + enteredString[7] + enteredString[15] + enteredString[2] + enteredString[11] + enteredString[3] + enteredString[25] + enteredString[5] + enteredString[13] + 2 * (enteredString[20] + enteredString[21] + enteredString[12] + enteredString[18] + enteredString[8]) == 2050 ) ++iResult; if ( enteredString[0] + enteredString[9] + enteredString[11] + enteredString[25] + enteredString[5] + 2 * enteredString[22] == 628 ) ++iResult; if ( enteredString[0] + enteredString[26] + enteredString[20] + enteredString[12] + enteredString[2] + enteredString[6] + enteredString[29] + enteredString[11] + enteredString[3] + enteredString[25] + enteredString[5] + enteredString[16] + 2 * (enteredString[22] + enteredString[9] + enteredString[19] + 2 * enteredString[28]) == 1842 ) ++iResult; if ( enteredString[24] + enteredString[10] + enteredString[9] + enteredString[11] + enteredString[16] == 491 ) ++iResult; if ( enteredString[22] + enteredString[23] + enteredString[24] + enteredString[17] + enteredString[12] + enteredString[6] + enteredString[29] + enteredString[27] + enteredString[5] + enteredString[16] + enteredString[28] + 3 * enteredString[4] + 2 * (enteredString[21] + enteredString[15] + enteredString[2] + enteredString[1] + enteredString[3] + enteredString[25]) == 2557 ) ++iResult; if ( enteredString[26] + enteredString[7] + enteredString[27] + 3 * enteredString[2] == 474 ) ++iResult; if ( enteredString[23] + enteredString[14] + enteredString[21] + enteredString[12] + enteredString[7] + enteredString[15] + enteredString[2] + enteredString[11] + enteredString[3] + enteredString[8] + 2 * (enteredString[18] + enteredString[6] + enteredString[27] + enteredString[28]) == 1472 ) ++iResult; if ( enteredString[17] + enteredString[7] + enteredString[2] + enteredString[25] + enteredString[5] + enteredString[13] + 3 * enteredString[28] == 723 ) ++iResult; if ( enteredString[0] + enteredString[22] + enteredString[23] + enteredString[14] + enteredString[24] + enteredString[21] + enteredString[12] + enteredString[10] + enteredString[7] + enteredString[15] + enteredString[19] + enteredString[29] + enteredString[3] + enteredString[16] + 3 * (enteredString[6] + enteredString[1]) + 2 * (enteredString[18] + enteredString[25]) == 2304 ) ++iResult; if ( enteredString[20] + enteredString[24] + enteredString[17] + enteredString[21] + enteredString[10] + enteredString[15] + enteredString[2] + enteredString[6] + enteredString[1] + enteredString[19] + enteredString[3] + enteredString[25] + enteredString[8] + enteredString[28] + 3 * enteredString[12] + 2 * (enteredString[22] + enteredString[26] + enteredString[18] + enteredString[4]) == 2234 ) ++iResult; if ( enteredString[22] + enteredString[12] + enteredString[10] + enteredString[4] + enteredString[29] == 463 ) ++iResult; if ( enteredString[21] + enteredString[18] == 211 ) ++iResult; if ( enteredString[0] + enteredString[22] + enteredString[23] + enteredString[21] + enteredString[18] + enteredString[7] + enteredString[4] + enteredString[11] + enteredString[8] + enteredString[28] + enteredString[13] + 3 * enteredString[12] + 2 * (enteredString[26] + enteredString[9] + enteredString[29] + enteredString[27]) == 2008 ) ++iResult; if ( enteredString[20] + enteredString[12] + enteredString[18] + enteredString[15] + enteredString[29] + enteredString[5] + enteredString[28] + 3 * enteredString[10] + 2 * (enteredString[14] + enteredString[25]) == 1228 ) ++iResult; if ( enteredString[0] + enteredString[24] + enteredString[21] + enteredString[9] + enteredString[4] + enteredString[2] + enteredString[1] + enteredString[11] + enteredString[3] + enteredString[5] + enteredString[8] + enteredString[28] == 1191 ) ++iResult; if ( enteredString[0] + enteredString[14] + enteredString[20] + enteredString[24] + enteredString[15] + enteredString[4] + enteredString[1] + enteredString[5] + enteredString[16] + 3 * enteredString[29] + 2 * (enteredString[2] + enteredString[8]) == 1691 ) ++iResult; if ( enteredString[0] + enteredString[23] + enteredString[14] + enteredString[17] + enteredString[12] + enteredString[10] + enteredString[9] + enteredString[15] + enteredString[19] + enteredString[3] + 2 * (enteredString[21] + enteredString[7] + enteredString[1] + enteredString[27] + enteredString[8] + 2 * enteredString[26]) == 2070 ) ++iResult; if ( enteredString[0] + enteredString[17] + enteredString[18] + enteredString[10] + enteredString[2] + enteredString[19] + enteredString[11] + enteredString[28] + 3 * (enteredString[14] + enteredString[20] + enteredString[1]) + 2 * (enteredString[26] + enteredString[7] + enteredString[4] + enteredString[3] + enteredString[25] + enteredString[5]) == 2776 ) ++iResult; if ( enteredString[20] + enteredString[10] + enteredString[2] + enteredString[1] + enteredString[19] + enteredString[11] + enteredString[3] + enteredString[27] + enteredString[16] + enteredString[28] + 3 * (enteredString[14] + enteredString[12]) + 2 * (enteredString[0] + enteredString[24] + enteredString[4]) == 2169 ) ++iResult; if ( enteredString[22] + enteredString[7] + enteredString[29] + enteredString[11] + enteredString[27] + enteredString[16] + enteredString[28] + enteredString[13] + 2 * (enteredString[23] + enteredString[6] + enteredString[25] + enteredString[5]) == 1394 ) ++iResult; if ( enteredString[0] + enteredString[22] + enteredString[14] + enteredString[24] + enteredString[21] + enteredString[18] + enteredString[4] + enteredString[6] + enteredString[29] + enteredString[3] + 3 * enteredString[2] + 2 * (enteredString[17] + 2 * enteredString[25]) == 1928 ) ++iResult; if ( enteredString[0] + enteredString[23] + enteredString[24] + enteredString[25] + enteredString[5] == 514 ) ++iResult; if ( enteredString[26] + enteredString[17] + enteredString[21] + enteredString[19] + enteredString[25] + enteredString[16] + enteredString[13] == 700 ) ++iResult; if ( enteredString[0] + enteredString[26] + enteredString[14] + enteredString[17] + enteredString[18] + enteredString[15] + enteredString[2] + enteredString[19] + enteredString[27] + enteredString[25] + enteredString[13] + 2 * enteredString[20] == 1184 ) ++iResult; if ( enteredString[0] + enteredString[23] + enteredString[20] + enteredString[24] + enteredString[12] + enteredString[15] + enteredString[4] + enteredString[29] + enteredString[3] + enteredString[5] + 2 * enteredString[11] == 1273 ) ++iResult; if ( enteredString[0] + enteredString[26] + enteredString[14] + enteredString[21] + enteredString[12] + enteredString[4] + enteredString[6] + enteredString[1] + enteredString[19] + enteredString[29] + enteredString[5] + enteredString[16] == 1192 ) ++iResult; if ( enteredString[22] + enteredString[21] + enteredString[12] + enteredString[15] + enteredString[11] + enteredString[8] + enteredString[28] + enteredString[13] + 2 * enteredString[14] == 913 ) ++iResult; if ( enteredString[24] + enteredString[18] + enteredString[10] + enteredString[25] + 2 * enteredString[20] == 555 ) ++iResult; if ( enteredString[26] + enteredString[1] + enteredString[16] == 257 ) ++iResult; if ( enteredString[12] + enteredString[18] + enteredString[7] + enteredString[9] + enteredString[15] + enteredString[4] + enteredString[3] + enteredString[13] + 2 * (enteredString[22] + enteredString[14] + enteredString[10] + enteredString[19] + enteredString[27]) == 1561 ) ++iResult; if ( enteredString[20] + enteredString[17] + enteredString[18] + enteredString[6] + enteredString[1] + enteredString[19] + enteredString[29] + enteredString[3] + enteredString[13] + 2 * enteredString[11] == 1113 ) ++iResult; if ( enteredString[20] + enteredString[24] + enteredString[10] + enteredString[15] + enteredString[6] + enteredString[13] + 2 * enteredString[22] == 589 ) ++iResult; if ( enteredString[23] + enteredString[26] + enteredString[14] + enteredString[17] + enteredString[21] + enteredString[18] + enteredString[10] + enteredString[3] + enteredString[25] + 3 * (enteredString[4] + enteredString[19] + enteredString[27]) + 2 * (enteredString[22] + enteredString[15] + enteredString[11]) == 2138 ) ++iResult; if ( enteredString[15] + enteredString[2] + enteredString[8] == 287 ) ++iResult; if ( enteredString[15] + enteredString[4] + enteredString[27] + enteredString[8] + enteredString[28] + 3 * enteredString[6] + 2 * enteredString[23] == 729 ) ++iResult; if ( enteredString[0] + enteredString[2] == 199 ) ++iResult; if ( enteredString[0] + enteredString[23] + enteredString[17] + enteredString[10] + enteredString[6] + enteredString[19] + enteredString[3] + enteredString[25] + enteredString[8] + 3 * (enteredString[21] + enteredString[1] + enteredString[11]) + 2 * (enteredString[22] + enteredString[14] + enteredString[12] + enteredString[29] + enteredString[5]) == 2787 ) ++iResult; if ( enteredString[21] + enteredString[10] + enteredString[7] + enteredString[9] + enteredString[4] + enteredString[19] + enteredString[11] + enteredString[3] + enteredString[28] + 2 * enteredString[2] == 1071 ) ++iResult; if ( enteredString[14] + enteredString[20] + enteredString[18] + enteredString[15] + enteredString[6] + enteredString[11] + enteredString[3] + enteredString[25] + enteredString[8] + enteredString[13] == 958 ) ++iResult; if ( enteredString[10] + enteredString[4] + enteredString[16] + 2 * enteredString[8] == 477 ) ++iResult; if ( enteredString[0] + enteredString[17] + enteredString[9] + enteredString[15] + enteredString[4] + enteredString[3] + enteredString[27] + enteredString[8] + 3 * enteredString[28] + 2 * (enteredString[14] + enteredString[20] + enteredString[7] + enteredString[2] + enteredString[6] + enteredString[16]) == 2015 ) ++iResult; if ( enteredString[0] + enteredString[22] + enteredString[26] + enteredString[14] + enteredString[20] + enteredString[10] + enteredString[7] + enteredString[15] + enteredString[1] + enteredString[27] + enteredString[28] + 2 * (enteredString[21] + enteredString[18] + enteredString[2] + enteredString[29]) == 1679 ) ++iResult; if ( enteredString[0] + enteredString[22] + enteredString[20] + enteredString[24] + enteredString[7] + enteredString[15] + enteredString[19] + enteredString[11] + enteredString[3] + enteredString[27] + enteredString[5] + enteredString[16] + enteredString[13] + 3 * enteredString[14] + 2 * (enteredString[12] + enteredString[10] + enteredString[4] + enteredString[25] + enteredString[28]) == 2404 ) ++iResult; if ( enteredString[12] + enteredString[18] + enteredString[1] + enteredString[29] + enteredString[8] + enteredString[28] + 3 * enteredString[13] + 2 * (enteredString[0] + enteredString[21] + enteredString[10] + enteredString[15] + enteredString[4] + enteredString[6] + enteredString[19] + enteredString[11] + enteredString[27]) == 2453 ) ++iResult; if ( enteredString[0] + enteredString[26] + enteredString[14] + enteredString[20] + enteredString[7] + enteredString[9] + enteredString[1] + enteredString[29] + enteredString[11] + enteredString[27] + enteredString[5] + enteredString[16] + enteredString[13] + 2 * (enteredString[17] + enteredString[3] + enteredString[28]) == 1722 ) ++iResult; if ( enteredString[12] + enteredString[18] + enteredString[7] + enteredString[15] + enteredString[4] + enteredString[2] + enteredString[6] + enteredString[1] + 3 * (enteredString[5] + enteredString[13]) + 2 * (enteredString[22] + enteredString[26] + enteredString[10] + enteredString[3] + enteredString[27] + enteredString[28]) == 1971 ) ++iResult; if ( enteredString[11] + enteredString[28] == 141 ) ++iResult; if ( enteredString[22] + enteredString[14] + enteredString[17] + enteredString[10] + enteredString[1] + enteredString[27] + 3 * (enteredString[20] + enteredString[7]) + 2 * (enteredString[18] + enteredString[4] + enteredString[19] + enteredString[25] + enteredString[13]) == 2184 ) ++iResult; if ( enteredString[24] + enteredString[17] + enteredString[21] + enteredString[10] + enteredString[7] + enteredString[2] + enteredString[29] + enteredString[11] + enteredString[3] + enteredString[25] + enteredString[16] + 3 * (enteredString[22] + enteredString[14]) + 2 * (enteredString[0] + enteredString[18] + enteredString[15] + enteredString[1] + enteredString[19] + enteredString[8]) == 2825 ) ++iResult; if ( enteredString[17] + enteredString[9] + enteredString[2] + enteredString[3] + enteredString[5] == 508 ) ++iResult; if ( enteredString[0] + enteredString[14] + enteredString[24] + enteredString[21] + enteredString[12] + enteredString[9] + enteredString[1] + enteredString[19] + enteredString[29] + enteredString[28] + 3 * (enteredString[18] + enteredString[13]) + 2 * enteredString[16] == 1861 ) ++iResult; if ( enteredString[20] + enteredString[15] + enteredString[29] + enteredString[11] + enteredString[27] + enteredString[16] + enteredString[13] == 673 ) ++iResult; if ( enteredString[23] + enteredString[24] + enteredString[17] + enteredString[21] + enteredString[18] + enteredString[9] + enteredString[15] + enteredString[4] + enteredString[19] + enteredString[3] + enteredString[16] + 3 * enteredString[29] + 2 * (enteredString[11] + enteredString[27] + enteredString[28] + 2 * enteredString[5]) == 2269 ) ++iResult; if ( enteredString[22] + enteredString[6] + enteredString[25] + enteredString[8] == 308 ) ++iResult; if ( enteredString[24] + enteredString[12] + enteredString[7] + enteredString[15] + enteredString[6] + enteredString[5] + enteredString[8] + enteredString[16] + 2 * enteredString[9] == 1012 ) ++iResult; if ( enteredString[14] + enteredString[16] == 216 ) ++iResult; if ( enteredString[0] + enteredString[24] + enteredString[17] + enteredString[21] + enteredString[12] + enteredString[7] + enteredString[9] + enteredString[6] + enteredString[1] + enteredString[27] + enteredString[16] + enteredString[13] + 3 * enteredString[8] + 2 * (enteredString[26] + enteredString[14] + enteredString[4] + enteredString[2] + enteredString[28]) == 2237 ) ++iResult; if ( enteredString[23] + enteredString[20] + enteredString[15] + enteredString[4] + enteredString[6] + enteredString[1] + enteredString[27] + 3 * enteredString[10] + 2 * enteredString[12] == 985 ) ++iResult; str_Result_Msg[5] = ' '; if ( iResult == 0x64 ) { str_Result_Msg[0] = 'T'; str_Result_Msg[1] = 'h'; str_Result_Msg[2] = 'a'; str_Result_Msg[3] = 't'; str_Result_Msg[4] = 's'; str_Result_Msg[6] = 'i'; str_Result_Msg[7] = 't'; str_Result_Msg[8] = '!'; str_Result_Msg[9] = '!'; str_Result_Msg[10] = '\0'; puts(str_Result_Msg); } else { str_Result_Msg[0] = 'N'; str_Result_Msg[1] = 'o'; str_Result_Msg[2] = 'p'; str_Result_Msg[3] = 'e'; str_Result_Msg[4] = ','; str_Result_Msg[6] = 'T'; str_Result_Msg[7] = 'r'; str_Result_Msg[8] = 'y'; str_Result_Msg[9] = ' '; str_Result_Msg[10] = 'a'; str_Result_Msg[11] = 'g'; str_Result_Msg[12] = 'a'; str_Result_Msg[13] = 'i'; str_Result_Msg[14] = 'n'; str_Result_Msg[15] = ' '; str_Result_Msg[16] = ';'; str_Result_Msg[17] = ')'; str_Result_Msg[18] = '\0'; puts(str_Result_Msg); } ((void (__stdcall *)(signed int))addr_Sleep)(750); return 0; }
Để trích xuất ra các vùng code tính toán mà không bị lẫn các đoạn code encrypt/decrypt, thực hiện script sau để loại bỏ:
/* IDC Script: this script used to finds both encryption and decryption loops and just nops them out*/ //declare local variables auto ea; auto addr; auto size; auto xorval; auto x; auto b; ea = MinEA(); ea = FindBinary(ea, SEARCH_DOWN , "60 E8 00 00 00 00 5E 81"); while (ea != BADADDR) { for (x=0;x<0x1C;x++) { PatchByte(ea+x, 0x90); } MakeUnknown(ea, 0x1C, 0); //undefine the specified MakeCode(ea); //convert to instruction ea = FindBinary(ea +1, SEARCH_DOWN , "60 E8 00 00 00 00 5E 81"); }
Script này được chỉnh lại từ script trên, đơn giản là thực hiện tìm kiếm cả encryption và decryption loops và nop
toàn bộ code liên quan. Sau đó, buộc IDA thực hiện phân tích lại vùng code đã patched.
Sau khi Script thực hiện xong, mã giả có được bằng HexRays sẽ như sau:
Sau khi có được thông tin toàn bộ mã giả tử HexRays, sử dụng trình Editor (ở đây tôi dùng Notepad++) để thực hiện lấy toàn bộ thông tin của các vùng code tính toán:
- Loại bỏ toàn bộ dấu cách thừa bằng cách thay thế 2 dấu cách (” “) bằng 1 dấu cách (” “). Lặp lại cho đến khi hết thì thôi. Ta có được kết quả tương tự như sau:
- Đặt mỗi phép tính trên một dòng bằng cách thay thế
“\r\n +” (new line,space,plus)
với” +” (space,plus)
và thay thế“\r\n *” (new line,space,star)
bằng” *” (space,star)
. Ta có được tương tự như sau:
- Loại bỏ các lệnh
“if”
. Loại bỏ các lệnh“++iResult;”
. Thay thế“==”
với“=”
. Kết quả như sau:
- Cuối cùng, đổi tên biến
“enteredString”
thành biến“z”
và loại bỏ các“[”
và“]”
,“( ”
và“ )”
. Cuối cùng có được code như sau:
z0 + z22 + z26 + z20 + z10 + z7 + 3 * z14 + 2 * (z23 + z24 + z17 + z21 + z12 + z18) = 2024 z0 + z22 + z23 + z26 + z14 + z24 + z17 + z12 + z10 + z15 + z4 + z2 + z6 + z1 + z29 + z11 + 2 * (z9 + z19) = 1927 z14 + z10 = 148 z0 + z14 + z10 + z11 + z3 + z25 + 2 * (z22 + z27) = 741 z24 + z29 = 229 z0 + z26 + z20 + z21 + z12 + z7 + z9 + z15 + z4 + z1 + z29 + z11 + z3 + z27 + z25 + z5 + z8 + z16 + 2 * (z6 + z19) = 2133 z14 + z17 + z7 + z15 + z11 + z8 = 619 z0 + z22 + z26 + z21 + z12 + z7 + z11 + z16 + z28 + 2 * z23 = 996 z24 + z17 + z6 + z1 + z29 + 2 * z21 = 717 z24 + z21 + z12 + z18 + z6 + z29 + z11 + z8 + z16 + 3 * z26 + 2 * (z0 + z17 + z2 + z19 + z5 + z28 + z13) = 2308 z20 + z17 + z21 + z7 + z9 + z1 + z19 + z11 + z27 + z8 + z28 + 3 * (z14 + z3) + 2 * (z0 + z23 + z18 + z6) = 2347 z0 + z26 + z20 + z24 + z10 + z9 + z6 + z11 + z25 + 2 * (z23 + z28) = 1041 z23 + z6 + z27 = 184 z23 + z18 + z9 + z19 + z11 + z25 + z5 + z16 + 2 * z1 = 1076 z0 + z22 + z26 + z20 + z24 + z10 + z7 + z4 + z2 + z6 + z19 + z11 = 1040 z0 + z22 + z23 + z14 + z18 + z10 + z4 + z6 + z1 + z19 + z11 + z8 + z16 + z28 + 5 * z21 + 3 * z13 + 2 * (z26 + z24) = 2393 z0 + z23 + z26 + z24 + z9 + z15 + z29 + z11 + z25 = 901 z0 + z22 + z18 + z10 + z7 + z9 + z29 + z11 + z28 + 3 * z26 = 893 z18 + z11 + z3 = 308 z22 + z14 + z20 + z12 + z10 + z4 + z2 + z19 + z29 + z5 + z8 + z13 + 2 * z18 = 1350 z0 + z26 + z14 + z20 + z17 + z7 + z9 + z1 + z19 + z5 + z8 + 2 * (z15 + z29 + z28) = 1580 z14 + z20 + z24 + z12 + z18 + z10 + z15 + z6 + z29 + z3 + z25 + 3 * z21 + 2 * (z0 + z7 + z4) = 2075 z23 + z26 + z24 + z17 + z21 + z18 + z10 + z6 + z11 + z5 + z8 + z13 + 3 * z22 + 2 * (z7 + z9 + z27) = 1721 z11 + z28 = 141 z26 + z24 + z17 + z12 + z7 + z4 + z29 + z5 + z16 + z13 + 2 * (z22 + z15 + z25) = 1550 z0 + z22 + z20 + z17 + z18 + z15 + z2 + z1 + z19 + z27 + z5 + z16 + z13 + 2 * (z14 + z24 + z10 + z7 + z6 + z11 + z25) = 2484 z22 + z17 + z10 + z5 + z16 + 2 * (z20 + z24) = 804 z7 + z4 + z2 + z27 + z25 + z5 + z8 + z16 + z13 + 3 * (z22 + z24 + z9) + 2 * (z0 + z1 + z28 + 2 * z10) = 2369 z23 + z17 + z12 + z27 + z16 + 2 * z9 = 704 z0 + z26 + z24 + z10 + z7 + z4 + z6 + z1 + z29 + z11 + z3 + z27 + z5 + z8 + z13 + 3 * z20 + 2 * (z22 + z14 + z15) = 2110 z26 + z14 + z21 + z18 + z9 + z15 + z2 + z29 + z3 + z5 = 968 z24 + z12 + z4 + z1 + z19 + z3 + z16 + 2 * (z26 + z21 + z6 + z5) = 1356 z0 + z22 + z21 + z9 + z15 + z29 + z3 + z5 + 3 * z23 + 2 * (z12 + z7 + z19 + z27) = 1869 z26 + z14 + z18 + z7 + z9 + z2 + z1 + z3 + z5 + z8 + z28 + 2 * (z0 + z20 + z17 + z21 + z15 + z6 + z19 + z25 + z13) = 2769 z22 + z23 + z10 + z15 + z19 + z11 + z8 + z28 + 2 * (z0 + z24 + z1 + z3 + z27 + 2 * (z26 + z7)) = 2147 z23 + z14 + z20 + z24 + z17 + z19 + z11 + z3 + z25 + z13 + 2 * (z0 + z21 + z9 + z2 + z6 + z1 + z16) = 2450 z0 + z26 + z24 + z17 + z21 + z18 + z10 + z9 + z19 + z27 + z25 + 3 * (z11 + z13) + 2 * (z12 + z28 + 2 * (z1 + z3)) = 2755 z0 + z23 + z26 + z20 + z21 + z12 + z7 + z9 + z2 + z1 + z11 + z5 + z16 + 3 * (z6 + z25) + 2 * (z24 + z18 + z10 + z15 + z28) = 2561 z21 + z4 + z19 + z5 + 2 * z14 = 642 z20 + z24 + z17 + z4 + z27 + z25 + z8 + z16 + 3 * z19 + 2 * (z26 + z14 + z7 + z13 + 2 * z29) = 2336 z20 + z24 + z12 + z18 + z10 + 3 * z3 + 2 * (z17 + z21 + z9 + z15 + z2 + z1 + z19 + z29 + z11 + z8) = 2925 z23 + z20 + z24 + z10 + z15 + z6 + z19 + z29 + z3 + z8 + z16 + z28 + 3 * z7 + 2 * (z14 + z17 + z12 + z9 + z1 + z25 + z13) = 2956 z22 + z26 + z24 + z7 + z15 + z2 + z11 + z3 + z25 + z5 + z13 + 2 * (z20 + z21 + z12 + z18 + z8) = 2050 z0 + z9 + z11 + z25 + z5 + 2 * z22 = 628 z0 + z26 + z20 + z12 + z2 + z6 + z29 + z11 + z3 + z25 + z5 + z16 + 2 * (z22 + z9 + z19 + 2 * z28) = 1842 z24 + z10 + z9 + z11 + z16 = 491 z22 + z23 + z24 + z17 + z12 + z6 + z29 + z27 + z5 + z16 + z28 + 3 * z4 + 2 * (z21 + z15 + z2 + z1 + z3 + z25) = 2557 z26 + z7 + z27 + 3 * z2 = 474 z23 + z14 + z21 + z12 + z7 + z15 + z2 + z11 + z3 + z8 + 2 * (z18 + z6 + z27 + z28) = 1472 z17 + z7 + z2 + z25 + z5 + z13 + 3 * z28 = 723 z0 + z22 + z23 + z14 + z24 + z21 + z12 + z10 + z7 + z15 + z19 + z29 + z3 + z16 + 3 * (z6 + z1) + 2 * (z18 + z25) = 2304 z20 + z24 + z17 + z21 + z10 + z15 + z2 + z6 + z1 + z19 + z3 + z25 + z8 + z28 + 3 * z12 + 2 * (z22 + z26 + z18 + z4) = 2234 z22 + z12 + z10 + z4 + z29 = 463 z21 + z18 = 211 z0 + z22 + z23 + z21 + z18 + z7 + z4 + z11 + z8 + z28 + z13 + 3 * z12 + 2 * (z26 + z9 + z29 + z27) = 2008 z20 + z12 + z18 + z15 + z29 + z5 + z28 + 3 * z10 + 2 * (z14 + z25) = 1228 z0 + z24 + z21 + z9 + z4 + z2 + z1 + z11 + z3 + z5 + z8 + z28 = 1191 z0 + z14 + z20 + z24 + z15 + z4 + z1 + z5 + z16 + 3 * z29 + 2 * (z2 + z8) = 1691 z0 + z23 + z14 + z17 + z12 + z10 + z9 + z15 + z19 + z3 + 2 * (z21 + z7 + z1 + z27 + z8 + 2 * z26) = 2070 z0 + z17 + z18 + z10 + z2 + z19 + z11 + z28 + 3 * (z14 + z20 + z1) + 2 * (z26 + z7 + z4 + z3 + z25 + z5) = 2776 z20 + z10 + z2 + z1 + z19 + z11 + z3 + z27 + z16 + z28 + 3 * (z14 + z12) + 2 * (z0 + z24 + z4) = 2169 z22 + z7 + z29 + z11 + z27 + z16 + z28 + z13 + 2 * (z23 + z6 + z25 + z5) = 1394 z0 + z22 + z14 + z24 + z21 + z18 + z4 + z6 + z29 + z3 + 3 * z2 + 2 * (z17 + 2 * z25) = 1928 z0 + z23 + z24 + z25 + z5 = 514 z26 + z17 + z21 + z19 + z25 + z16 + z13 = 700 z0 + z26 + z14 + z17 + z18 + z15 + z2 + z19 + z27 + z25 + z13 + 2 * z20 = 1184 z0 + z23 + z20 + z24 + z12 + z15 + z4 + z29 + z3 + z5 + 2 * z11 = 1273 z0 + z26 + z14 + z21 + z12 + z4 + z6 + z1 + z19 + z29 + z5 + z16 = 1192 z22 + z21 + z12 + z15 + z11 + z8 + z28 + z13 + 2 * z14 = 913 z24 + z18 + z10 + z25 + 2 * z20 = 555 z26 + z1 + z16 = 257 z12 + z18 + z7 + z9 + z15 + z4 + z3 + z13 + 2 * (z22 + z14 + z10 + z19 + z27) = 1561 z20 + z17 + z18 + z6 + z1 + z19 + z29 + z3 + z13 + 2 * z11 = 1113 z20 + z24 + z10 + z15 + z6 + z13 + 2 * z22 = 589 z23 + z26 + z14 + z17 + z21 + z18 + z10 + z3 + z25 + 3 * (z4 + z19 + z27) + 2 * (z22 + z15 + z11) = 2138 z15 + z2 + z8 = 287 z15 + z4 + z27 + z8 + z28 + 3 * z6 + 2 * z23 = 729 z0 + z2 = 199 z0 + z23 + z17 + z10 + z6 + z19 + z3 + z25 + z8 + 3 * (z21 + z1 + z11) + 2 * (z22 + z14 + z12 + z29 + z5) = 2787 z21 + z10 + z7 + z9 + z4 + z19 + z11 + z3 + z28 + 2 * z2 = 1071 z14 + z20 + z18 + z15 + z6 + z11 + z3 + z25 + z8 + z13 = 958 z10 + z4 + z16 + 2 * z8 = 477 z0 + z17 + z9 + z15 + z4 + z3 + z27 + z8 + 3 * z28 + 2 * (z14 + z20 + z7 + z2 + z6 + z16) = 2015 z0 + z22 + z26 + z14 + z20 + z10 + z7 + z15 + z1 + z27 + z28 + 2 * (z21 + z18 + z2 + z29) = 1679 z0 + z22 + z20 + z24 + z7 + z15 + z19 + z11 + z3 + z27 + z5 + z16 + z13 + 3 * z14 + 2 * (z12 + z10 + z4 + z25 + z28) = 2404 z12 + z18 + z1 + z29 + z8 + z28 + 3 * z13 + 2 * (z0 + z21 + z10 + z15 + z4 + z6 + z19 + z11 + z27) = 2453 z0 + z26 + z14 + z20 + z7 + z9 + z1 + z29 + z11 + z27 + z5 + z16 + z13 + 2 * (z17 + z3 + z28) = 1722 z12 + z18 + z7 + z15 + z4 + z2 + z6 + z1 + 3 * (z5 + z13) + 2 * (z22 + z26 + z10 + z3 + z27 + z28) = 1971 z11 + z28 = 141 z22 + z14 + z17 + z10 + z1 + z27 + 3 * (z20 + z7) + 2 * (z18 + z4 + z19 + z25 + z13) = 2184 z24 + z17 + z21 + z10 + z7 + z2 + z29 + z11 + z3 + z25 + z16 + 3 * (z22 + z14) + 2 * (z0 + z18 + z15 + z1 + z19 + z8) = 2825 z17 + z9 + z2 + z3 + z5 = 508 z0 + z14 + z24 + z21 + z12 + z9 + z1 + z19 + z29 + z28 + 3 * (z18 + z13) + 2 * z16 = 1861 z20 + z15 + z29 + z11 + z27 + z16 + z13 = 673 z23 + z24 + z17 + z21 + z18 + z9 + z15 + z4 + z19 + z3 + z16 + 3 * z29 + 2 * (z11 + z27 + z28 + 2 * z5) = 2269 z22 + z6 + z25 + z8 = 308 z24 + z12 + z7 + z15 + z6 + z5 + z8 + z16 + 2 * z9 = 1012 z14 + z16 = 216 z0 + z24 + z17 + z21 + z12 + z7 + z9 + z6 + z1 + z27 + z16 + z13 + 3 * z8 + 2 * (z26 + z14 + z4 + z2 + z28) = 2237 z23 + z20 + z15 + z4 + z6 + z1 + z27 + 3 * z10 + 2 * z12 = 985
Với một hệ phương trình tuyến tính rối rắm có được như trên, nghĩ ngồi để giải được cái đồng phương trình này chắc chết . May mắn thay có một site hỗ trợ giải phương trình online tại: http://wims.unice.fr/wims/en_tool~linear~linsolver.en.html. Truy cập vào trang Web và paste toàn bộ đoạn code trên vào, sau đó nhấn “Solve the problem”:
{ z0 = 102, z1 = 108, z10 = 48, z11 = 108, z12 = 118, z13 = 101, z14 = 100, z15 = 95, z16 = 116, z17 = 104, z18 = 97, z19 = 116, z2 = 97, z20 = 95, z21 = 114, z22 = 49, z23 = 103, z24 = 104, z25 = 116, z26 = 33, z27 = 33, z28 = 33, z29 = 125, z3 = 103, z4 = 123, z5 = 89, z6 = 48, z7 = 117, z8 = 95, z9 = 115 }.
Chuyển đổi toàn bộ kết quả trên trên thành kí tự tương ứng sẽ có được flag cần tìm. Code bằng Python:
asscii=[102, 108, 97, 103, 123, 89, 48, 117, 95, 115, 48, 108, 118, 101, 100, 95, 116, 104, 97, 116, 95, 114, 49, 103, 104, 116, 33, 33, 33, 125] flag = "".join([chr(c) for c in asscii]) print flag
Kết quả có được Flag: flag{Y0u_s0lved_that_r1ght!!!}
.Kiểm tra kết quả: