Archive for the ‘IDA Pro section’ Category

[IDA Plug] Keypatch

Posted: September 16, 2016 in IDA Pro section, Keypatch, Uncategorized
Tags: ,

Keypatch is a plugin of IDA Pro for Keystone Assembler Engine.Keypatch consists of 3 tools inside.

  • Patcher & Fill Range: these allow you to type in assembly to directly patch your binary.
  • Assembler: this interactive tool let you enter assembly & get back instruction encoding.

Keypatch is confirmed to work on IDA Pro version 6.4, 6.6, 6.8, 6.9, 6.95 but should work flawlessly on older versions. If you find any issues, please report.

Keypatch offers some nice features:

  • Cross-architecture: support Arm, Arm64 (AArch64/Armv8), Hexagon, Mips, PowerPC, Sparc, SystemZ & X86 (include 16/32/64bit).
  • Cross-platform: work everywhere that IDA works, which is on Windows, MacOS, Linux.
  • Based on Python, so it is easy to install as no compilation is needed.
  • User-friendly: automatically add comments to patched code, and allow reverting (undo) modification.
  • Open source under GPL v2.

keypatch_patcher2

Version 2.0.1

@aquynh aquynh released this 20 hours ago

  • Fix an off-by-one bug in Fill-Range function.
  • Log more information when padding NOP

Download: https://github.com/keystone-engine/keypatch/archive/2.0.1.zip


Contributed By Check Point Software Technologies LTD.

Features

1. Seamless synchronization of labels, function names, comments and global variables (w/wo demangling)

  • Synchronization modes
    • On demand
    • On rename (update on-the-fly)
  • Supports image base-independent synchronization

2. Dynamic dumping of debugged process memory regions

It can be useful in the following cases:

  • When debugged process has extracted/temporary/injected module which doesn’t appear in modules list
  • When it doesn’t have a valid PE header
  • When it have corrupted import table, etc.

3. Python scripting

We support the following list of debug backends for now:

Latest release: v_1_1_0_3

[-] anti-dubug: removed hardcoded classname/window name
[*] OllyDbg20: updated SWIG SDK-wrapper compatibility with win types
[*] dbg backends FIX: fixed trucation of RPC request
[*] dbg backends FIX: now we send packet length for each RPC call for additional message check


Viết linh tinh ……too_sad

Cơ bản, nhiều người có cùng suy nghĩ chung là không sử dụng IDA trong việc unpack file và theo tôi quan điểm này không có gì sai, vì như đã biết việc unpack thường sử dụng các trình debugger như OllyDBG/Immunity kết hợp với các công cụ fix PE file (LordPE; ImpREC, Scylla…). Tuy nhiên, trong bài viết này chúng ta sẽ thử dùng IDA để unpack một unpackme đơn giản, không sử dụng các biện pháp bảo vệ cao cấp, mục đích chủ yếu là để biết được cách thức thực hiện như thế nào với IDA.

Công cụ sử dụng:

  • DIE v1.01 (Detect It Easy)
  • IDA 6.8
  • Peditor v1.7 (yoda&M.o.D)
  • Scylla v0.9.8

Tải Unpackme tại: https://www.hex-rays.com/products/ida/support/tutorials/unpack_pe/test00.exe

Trước tiên, dùng DIE để kiểm tra sơ bộ unpackme:

2016-04-16_16-15-00

Fig.1

File được pack bằng MEW(SE v1.0), đoán là bản Standard Edition. Gồm 2 sections, section đầu có tên là MEW và section thứ hai có tên rất loằng ngoằng:

2016-04-16_16-18-47

Fig.2

Thông tin về các hàm APIs được unpackme sử dụng:

2016-04-16_16-20-04

Fig.3

OK thông tin cơ bản đã có. Tiếp theo mở IDA và load unpackme:

2016-04-16_16-05-50

Fig.4

Giữ nguyên các tùy chọn mặc định tại phần Options, nhấn OK để tiếp tục, ta nhận được thông báo sau:

2016-04-16_16-11-15

Fig.5

Thông báo này cho biết, section có ký tự loằng ngoằng bên dưới section MEW đã bị cắt bỏ các offsets và IDA sẽ chỉ đọc 0x7A1 bytes. Bỏ qua cảnh báo này, nhấn OK để tiếp tục, một thông báo nữa xuất hiện cho biết import của file đã bị hủy, điều này có nghĩa là khả năng lớn là file đã bị pack hoặc đã bị chỉnh sửa khiến cho việc phân tích trở nên khó khăn:

2016-04-16_16-25-47

Fig.6

Nhấn OK, để tiếp tục, IDA sẽ dừng lại tại đây:

2016-04-16_16-32-25

Fig.7

Quan sát tại màn hình IDA, lúc này ta thấy trước các byte đều xuất hiện cụm “dd” hay “db”. Điều này có nghĩa là IDA không nhận diện được code nên nó diễn giải dữ liệu dưới dạng dword (dd), word(dw), byte(db). IDA cho phép chúng ta thay đổi kiểu dữ liệu bằng cách nhấn phím tắt D:

2016-04-16_16-50-10

Fig.8

Để cấu hình các kiểu dữ liệu chọn Options > Setup data types… hoặc nhấn Alt+D:

2016-04-16_16-52-43

Fig.9

Đây là các thiết lập mặc định của IDA để chuyển đổi giữa các kiểu byte, word và dword khi nhấn D, tuy nhiên ta cũng có thể cấu hình thêm các loại dữ liệu khác nếu cần thiết. Trong trường hợp này của unpackme, ta cần không thực hiện việc thay đổi kiểu dữ liệu nữa mà thực hiện chuyển đổi các dữ liệu này sang các lệnh assembly. Để thực hiện việc chuyển đổi này, IDA hỗ trợ phím tắt C hoặc vào Edit > Code:

2016-04-16_17-11-40

Fig.10

Kết quả có được như sau:

2016-04-16_17-13-25

Fig.11

Ta thấy rằng, dữ liệu đã được chuyển thành một lệnh nhảy tới địa chỉ thuộc section đầu tiên, bắt đầu từ 400000 và kết thúc tại 401000. Vì IDA đã không nhận diện được code chuẩn ngay từ đầu nên lệnh nhảy này cũng không cho ta nhiều thông tin, chọn địa chỉ 400158 và nhấn Enter để follow cũng không tới được địa chỉ đó. Nếu như chúng ta sử dụng trình debugger như OllyDBG thì hoàn toàn có thể tới được địa chỉ trên:

2016-04-16_17-28-16

Fig.12

Tuy nhiên, mục tiêu của bài viết là sử dụng IDA để thực hiện nên ta sẽ làm theo cách khác. Ta sẽ thay đổi cách load file với tùy chọn Manual load như đã thấy trong phần Options của IDA. Mở lại unpackme, lựa chọn như hình minh họa:

2016-04-16_17-35-49

Fig.13

Tùy chọn Manual load cho phép ta quyết định sections nào sẽ được load vào IDA thay vì để IDA tự động load toàn bộ, việc bỏ tùy chọn Create imports segment sẽ loại bỏ cảnh báo của IDA về việc IAT bị hủy. Sau khi cấu hình như trên, nhấn OK để tiếp tục:

2016-04-16_17-42-20

Fig.14

IDA yêu cầu nhập địa chỉ của ImageBase. Ta giữ nguyên không thay đổi, nhấn OK để tiếp tục, IDA sẽ yêu cầu xác nhận việc nạp các sections và file header:

2016-04-16_17-44-24

Fig.15

2016-04-16_17-44-24

Fig.16

2016-04-16_17-46-15

Fig.17

Nhấn Yes để xác nhận, sau khi IDA load xong, nhấn C để chuyển dữ liệu sang code:

2016-04-16_17-54-27

Fig.18

Như đã thấy trên hình, địa chỉ 400158 đã được IDA nhận dạng là một location cụ thể, nhấn đúp chuột vào địa chỉ này ta tới vùng code bắt đầu tại địa chỉ đó:

2016-04-16_17-57-47

Fig.19

Tại đây được IDA nhận là Header code, nhấn P để tạo function hoặc chọn Edit > Functions > Create function…

2016-04-16_20-06-06

Fig.20

Nhấn space bar để chuyển sang Graphic mode. Quan sát tại màn hình Graphic ta thấy có rất nhiều lệnh call và lệnh nhảy, các lệnh call đều liên quan đến thanh ghi ebx. Thanh ghi ebx được khởi tạo bởi hai lệnh mov esi, 40601Ch & mov ebx, esi:

2016-04-16_20-19-37

Fig.21

Quan sát giá trị tại 0x40601C xem có thông tin gì:

2016-04-16_20-23-40

Fig.22

Nhấn D để chuyển đổi kiểu dữ liệu về giá trị dword:

2016-04-16_20-25-34

Fig.23

Chuyển tới địa chỉ 0x400130, quan sát tại đây có thể thấy rằng vùng code thể hiện thông tin của các sections tương ứng với thông tin mà ta thấy được khi xem bằng DIE:

2016-04-16_20-36-44

Fig.24

Tên của section thứ nhất (“MEW”) thì rõ ràng rồi, nhưng tên của section thứ hai thì nhìn rối rắm và dường như nó đã được encrypt hoặc có thể chứa thông tin gì đó. Chọn tên section này và thử nhấn C để chuyển sang mã lệnh, ta thấy có lệnh được ẩn trong chuỗi tên:

2016-04-16_20-46-51

Fig.25

Ta thấy có hai lệnh nhảy tới hai địa chỉ là 400108+7 và 400108+4, các địa chỉ này đều nằm giữa chuỗi tên của section thứ nhất, để có thông tin cụ thể về các địa chỉ này ta cần phải undefine vùng địa chỉ chứa tên của section thứ nhất. Chọn địa chỉ 0x400108 và nhấn phím U:

2016-04-16_21-05-16

Fig.26

Sau khi undefine, ta thấy tên của section thứ nhất chính xác chỉ từ 0x400108 đến 0x40010B, còn các vùng từ 0x40010C tới 0x40010F là vùng dữ liệu được IDA đánh dấu là unk (unknown). Để chỉnh sửa lại cho chính xác, nhấn C để chuyển đổi vùng đó thành code:

2016-04-16_21-19-48

Fig.27

Sau khi chuyển đổi thành công thì đoạn code tại 0x400130 cũng thay đổi theo:

2016-04-16_21-23-31

Fig.28

Thông tin thu được khá hữu ích rồi, tuy nhiên để tiếp tục ta phải sử dụng tới việc debug. Lựa chọn trình debugger như hình:

2016-04-16_21-32-57

Fig.29

Quay lại lệnh nhảy tới sub_400158, nhấn F2 để đặt một breakpoint:

2016-04-16_21-34-46

Fig.30

Sau khi đặt bp xong, nhấn F9 để run unpackme, ta sẽ dừng lại tại bp:

2016-04-16_21-40-13

Fig.31

Nhấn F7 để trace tới sub_400158:

2016-04-16_21-41-43

Fig.32

2016-04-16_21-43-10

Fig.33

Tại màn hình debug của IDA, nhấn Shift+F7 để mở cửa sổ Segments. Quan sát tại cửa sổ này ta thấy thông tin về các sections của file. Thông thường, dưới thông tin về PE header sẽ là section .text (ở đây có thể là section MEW(đã bị packer đổi tên)):

2016-04-16_22-01-59

Fig.34

Theo thông tin cửa sổ Segments cung cấp thì section MEW bắt đầu từ 0x401000 và kết thúc tại 0x406000, vậy size của section này là 0x5000. Tiếp theo, mở cửa sổ Breakpoint lists (Ctrl+Alt+B) để thiết lập một bp tương tự như ta đặt memory bp trong OllyDBG. Tại cửa sổ Breakpoints, nhấn Ins để thiết lập thêm một bp như sau:

2016-04-17_1-24-04

Fig.35

Với thông tin như trên, ta sẽ thiết lập một bp tại section đầu tiên (thường là section chứa OEP), nơi mà code sẽ được ghi vào để xem code được decompress tại section đó như thế nào. Ở đây ta chọn section MEW tại 0x401000 và kích thước là 0x5000 để yêu cầu dừng lại khi đạt tới kích thước đã thiết lập. Sau khi đặt xong, nhấn F9 để thực thi:

2016-04-16_22-28-09

Fig.36

Sau khi dừng lại tại bp, ta thấy code đã được decompress xong. Bước tiếp theo ta sẽ tiến hành dump toàn bộ file. Dựa trên thông tin từ màn hình Segments cung cấp, ta sẽ dump file bắt đầu từ 0x400000 tới 0x407004. Để dump được ta sử dụng idc script sau:

static main()
{
auto fp, ea;
fp = fopen("test00_dump.bin", "wb");
for ( ea=0x400000; ea < 0x407004; ea++ )
  fputc(Byte(ea), fp);
}

Tại IDA, nhấn Shift+F2 để mở cửa sổ thực thi script, copy&paste đoạn script trên vào, sau đó nhấn Run để thực hiện:

2016-04-17_1-36-22

Fig.37

Kết quả, ta có file được dump ra là test00_dump.bin nằm cùng thư mục của unpackme:

2016-04-17_1-40-01

Fig.38

Sử dụng PEditor để mở file vừa được dump:

2016-04-17_1-42-02

Fig.39

Nhấn sections để xem thông tin về các section, chuột phải tại section MEW và chọn:

2016-04-17_1-44-59

Fig.40

Sau khi dump xong, đổi .bin thành .exe:

2016-04-17_1-48-53

Fig.41

Bước cuối cùng của quá trình unpack chính là fix IAT. Mở Scylla và chọn process test00.exe. Chỉnh lại OEP thành 0x401000, sau đó nhấn IAT Autosearch:

2016-04-17_1-53-28

Fig.42

OK Scylla đã tìm thấy thông tin của IAT, tiếp theo nhấn Get Imports để nhận các APIs:

2016-04-17_1-56-59

Fig.43

Tìm thấy 19 hàm APIs mà unpackme sử dụng, không có invalid. Nhấn Fix Dump để thực hiện fix cho file test00_dump.exe:

IDA_19funcs

Fig.44

OK, vậy là quá trình rebuild thành công, Scylla tạo ra file mới là test00_dump_SCY.exe. Chạy file đã fix kết quả như sau:

2016-04-17_2-02-57

Fig.45

Vậy là quá trình unpack đã thành công!!

2016-04-21_18-33-26


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 ….emo_popo_choler. 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. sexy_girl.

Load crackme vào IDA, quan sát code tại _main thấy như sau:

2015-11-05_9-39-22Đặt BP tại lệnh popa:

2015-11-05_9-53-19Tiế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:

2015-11-05_9-57-35Cuộ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 beated và vùng code bị encrypted ở dưới còn rất nhiều:

2015-11-05_10-03-252015-11-05_10-04-38Việ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:

2015-11-05_10-24-53Sau 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.

2015-11-05_10-50-56Phân tích sơ bộ và đặt tên lại một số biến, ta có được thông tin sau:

2015-11-05_11-01-16Sau đó 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:

2015-11-05_11-04-562015-11-05_11-07-24Mã giả có được bằng Hexrays:

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ênextreme_sexy_girl. 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.

2015-11-05_12-08-17Sau khi Script thực hiện xong, mã giả có được bằng HexRays sẽ như sau:

2015-11-05_12-16-22Sau 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:

2015-11-05_15-48-02

  • Đặ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:

2015-11-05_15-54-01

  • 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:

2015-11-05_15-59-46

  • Cuối cùng, đổi tên biến “enteredString” thành biến “z” và loại bỏ các “[”“]”, “( ”“ )”. 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 sexy_girl. 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”:

2015-11-05_16-14-09Kết quả, có được như sautoo_sad:

2015-11-05_16-16-27Cụ thể:

{ 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ả:

2015-11-05_16-55-38End..

[IDA Plugin] IDA Stingray

Posted: October 9, 2015 in IDA Stingray
Tags: ,

stingray
Tác giả: darx0r

Site: https://github.com/darx0r/Stingray

Sơ lược:

Stingray là một IDAPython plugin, tính năng chính của plugin này tìm kiếm các chuỗi (strings) có trong hàm, hỗ trợ thực hiện tìm kiếm đệ quy thông qua khả năng cho phép cấu hình độ sâu của việc tìm kiếm. Đối với mỗi string được tìm thấy sẽ được hiển thị thêm thông tin về địa chỉ xrefs (địa chỉ sử dụng string), địa chỉ của chuỗi, kiểu chuỗi (string type).

Yêu cầu cài đặt:

Phải sử dụng IDA (Hex Rays Interactive Disassembler) có phiên bản >= 6 cùng với IDAPython.

Sử dụng:

Chép file Stingray.py vào thư mục chứa Plugin của IDA. Nếu thành công, khi khởi động IDA và phân tích target, Stingray sẽ xuất hiện tại : Edit/Plguins/Stingray. Mặc định Stingray đã được tác giả cấu hình với độ sâu tìm kiếm là 0 (không sử dụng tìm kiếm đệ quy) và phím tắt của plugin là Shift+S. Tuy nhiên, có thể cấu hình lại Stingray bất kỳ lúc nào thông qua Options\Stingray Config . Nếu không muốn tìm kiếm đệ quy, cấu hình lại chế độ search. lựa chọn độ sâu là 0.

StingrayHình minh họa

[IDA Plugin] Snowman

Posted: September 19, 2015 in [IDA Plugin] Snowman
Tags:

Home site: http://derevenets.com

Snowman (tên cũ trước đây là SmartDec), là một plugin hoàn toàn miễn phí, cung cấp khả năng dịch ngược về mã nguồn gốc C/C++ tương tự như plugin nổi tiếng HexRays, hỗ trợ đa nền tảng như x86, AMD64, và ARM. Plugin này tích hợp hoàn toàn với giao diện của IDA, hỗ trợ cho phép dịch ngược một hàm được lựa chọn hoặc toàn bộ chương trình chỉ bằng một phím tắt (nói theo ngôn ngữ teen bây giờ là “dịch ngược trong vòng một nốt nhạc” 😀 ) và dễ dàng chuyển đổi qua lại giữa mã disassembler và mã đã được dịch ngược.

Phiên bản mới nhất của Plugin là v0.0.8 (17 September 2015), hỗ trợ các phiên bản IDA 6.3-6.8:

  • x86: automatic choice between AMD64 and MSVC 64-bit calling conventions.
  • PE parser: added parsing of exports (thanks to Jeff Muizelaar).
  • ELF parser: fixed reading of section headers in big-endian executables (thanks to Markus Gothe for reporting).
  • Improved LikeC code simplification: support for the index operator, special treatment of expressions in the boolean context, simplification of mathematical identities.
  • Improved and corrected reconstruction of expressions.
  • Fixed an error in the structural analysis leading to assertion failure during code generation.
  • ASCII strings detection is now more pessimistic.
Để sử dụng, tải plugin tại đường dẫn sau: http://derevenets.com/files/snowman-plugin-v0.0.8-win-qt4.8.7z. Sau đó giải nén và copy vào thư mục plugins của IDA. Sau khi load chương trình vào IDA để phân tích, lựa chọn hàm cần dịch ngược và nhấn phím tắt của plugin là F3.
 SnowmanHình minh họa
PS: Hiện tại, nhóm tác giả của plugin đang nỗ lực để hoàn thiện plugin này nhằm tạo ra mã tốt hơn (tham vọng chắc là phải tương đương HexRays 🙂 ), giao diện tiện lợi hơn và hỗ trợ thêm nhiều nền tảng khác nữa. Trong quá trình sử dụng nếu có vấn đề gì liên quan có thể góp ý tại đây: https://github.com/yegord/snowman
Regards,
m4n0w4r

pyedit

Tác giả : storm shadow (aka Techbliss Owner (http://techbliss.org))
Thông tin về trình editor có thể xem tại đây: https://github.com/techbliss/Python_editor

Theo như tác giả viết, tác giả cảm thấy chán ghét khi phải thực thi các python script theo cách cũ, do đó đã nảy ra ý tưởng và tự code một trình Python Editor dành riêng cho IDA. Trình soạn thảo này tương tự như trình soạn thảo mà IDA đã có nhưng nó đẹp hơntốt hơn 🙂 (theo như quảng cáo :D)

Để cài đặt và sử dụng được trình soạn thảo này (nếu như đọc trên site thì thấy tác giả viết hơi rối rắm 🙂 hoặc có thể là do tôi đọc hoài không hiểu :P) thực hiện các bước sau đây:

  1. Vào link sau https://drive.google.com/file/d/0B5KQmTKmJ3kQNl9UQlMzMDZLMFE/view?usp=sharing để tải PyQt4_withcorrect_runtime.zip. Trong file nén này bao gồm các requirement packages để phục vụ việc thực thi trình soạn thảo, bao gồm PyQt4Sip dành cho PyQt4.
  2. Sau khi download được PyQt4_withcorrect_runtime.zip, tiến hành bung nén toàn bộ vào thư mục: C:\Python27\Lib\site-packages. Sau khi bung sẽ có được C:\Python27\Lib\site-packages\PyQt4 và 3 file sip tại C:\Python27\Lib\site-packages\
  3. Tiếp theo tải Python Editor v2 tại đây https://github.com/techbliss/Python_editor
  4. File download về là Python_editor-master.zip. Tiến hành bung nén, sau đó copy toàn bộ thư mục Code editor và file Python_editor.py vào thư mục plugins của IDA.
  5. Quá trình cài đặt hoàn tất, load IDA lên sẽ nhận được thông tin sau tại Output Window:opwindow
  6. Để kích hoạt, chọn Menu Edits > Plugins > Python Editor. Lúc đó, trình soạn thảo sẽ được load vào menu File, tương tự như hình dưới đây:
    editfilemenu
  7. Nhấn phím tắt Alt + E để mở trình Python Editor:
    PythonEditor

Chúc các bạn thành công!

Regards,
m4n0w4r