好友
阅读权限 10
听众
最后登录 1970-1-1
小哈龙
发表于 2017-7-4 11:16
使用论坛附件上传样本压缩包时必须使用压缩密码保护,压缩密码:52pojie,否则会导致论坛被杀毒软件等误报,论坛有权随时删除相关附件和帖子! 病毒分析分区附件样本、网址谨慎下载点击,可能对计算机产生破坏,仅供安全人员在法律允许范围内研究,禁止非法用途! 禁止求非法渗透测试、非法网络攻击、获取隐私等违法内容,即使对方是非法内容,也应向警方求助!
本帖最后由 小哈龙 于 2017-8-4 14:03 编辑
1 MBR病毒样本分析
1.1 基本信息
样本类型:MBR感染样本
大小:36864 字节 36KB
MD5:955b66c722ca993dd11fbe56bbf92525
壳种类:无壳
编译器信息:VC++6.0
简介:该样本是一个修改MBR的病毒。
mbr.zip
(10.91 KB, 下载次数: 174)
感染症状:感染该病毒后,刚开始并不会发现有什么异常情况,但是当你重启电脑后,你就会发现电脑启动停留在一个黑色界面,带着恶意文字,在WIN7虚拟机 中运行过后重启系统的结果,感染后重启电脑如图4-1所示
图4-1 感染病毒效果图
文件变化:无
注册表变化:无
网络行为:无
1.2 详细分析
(1)首先总体看一下病毒程序布局
将病毒文件载入IDA ,首先观察IDA 的Functions window 界面,如图4-2所示:
图4-2 IDA FunctionWindow图
因为该病毒文件是采用VC++6.0编译的,看到main函数,就试着点开看一下,双击main函数后,在IDA中看到如下汇编代码,该段介绍的是该病毒程序的主函数,包含两个子模块:
[C++] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
int
__cdecl main(
int
argc,
const
char
**argv,
const
char
**envp)
_main proc near
push 1 ;
int
push offset aSedebugprivile ;
"SeDebugPrivilege"
call sub_401000
add esp, 8
jmp sub_401090
_main endp
(2)模块一分析
汇编语言函数是以:函数名 proc(参数列表) 这样的格式,由此看出此函数有可能是病毒程序的主函数,
push offset aSedebugprivile; "SeDebugPrivilege";
这句汇编代码后面提示此处压栈的字符是“SeDebugPrivilege”,这是Windows的字符权限名称,一般用在进程提权中使用,然后看下面三句汇编代码:
[Asm] 纯文本查看 复制代码
1
2
3
push
1
push
offset
aSedebugprivile
call
sub_4010002.
首先将两个值压栈,其中一个值还与进程提权有关,下面一个call,指向了另一个位置,想到这里,这个call里面的操作估计与进程提权相关,在IDA中双击call跟进,查看call的内容,为了直观这里切换到IDA 的Graph view,双击call出现的内容,如图4-3:
图4-3 IDA call sub_401000 Graph View图
进入这个界面,该从哪里才下手呢,刚才分析,这个call所做的操作与进程提权相关,要想提升一个进程的权限,那么首先要做的第一步是得到当前进程的句柄,查看call进来的汇编代码发现一个API GetCurrentProcess,这个API是获取当前进程的句柄的,这就正确了,设想是正确的,就从这里下手,如下汇编代码,主要介绍两个进程提权的API函数GetCurrentProcess和OpenProcessToken
[Asm] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
9
push
esi
push
eax
push
28h
mov
esi
, 1
call
ds
:GetCurrentProcess
push
eax
call
ds
:OpenProcessToken
test
eax
,
eax
jnz
short
loc_401028
上面汇编代码,就是两个函数,第一个先将三个参数压栈,调用GetCurrentProcess函数获取当前进程句柄,随后将句柄返回寄存器eax(汇编语言的函数返回值默认存储在寄存器eax中),随后call ds:OpenProcessToken 调用OpenProcessToken函数,获取进程令牌句柄,并将返回值保存在eax中。test eax, eax jnz short loc_401028 这两条语句,先test eax,eax会改变标志位ZF,使ZF不等于1,jnz表示标志位ZF不等于1时,跳转,因此此处跳转到shortloc_401028处。在图4-3中右下角那一个模块中,下边看一下汇编代码,主要功能修改进程权限
[Asm] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
loc_401028:
mov
ecx
, [
esp
+18h+arg_4]
mov
eax
, [
esp
+18h+lpName]
neg
ecx
lea
edx
, [
esp
+18h+NewState.Privileges]
mov
[
esp
+18h+NewState.PrivilegeCount],
esi
sbb
ecx
,
ecx
push
edx
and
ecx
, 2
push
eax
push
0
mov
[
esp
+24h+NewState.Privileges.Attributes],
ecx
call
ds
:LookupPrivilegeValueA
mov
edx
, [
esp
+18h+hObject]
push
0
push
0
lea
ecx
, [
esp
+20h+NewState]
push
10h
push
ecx
push
0
push
edx
call
ds
:AdjustTokenPrivileges
call
ds
:GetLastError
test
eax
,
eax
在前边叙述中,已经获取当前进程的进程令牌,根据提升进程权限的操作,下一步要做的操作就是要查询进程的权限。简单分析之后,看一下上边代码,其中两个关键的call是需要注意的: call ds:LookupPrivilegeValueA 这个API函数就是查询进程权限的,与提升进程权限的步骤完全一致,根据VC++函数压栈的顺序第一个参数到第三个参数的压入顺序就是: push 0 ; lpSystemName push eax ; lpName push edx ; lpLuid 然后call,直接调用该函数,这是第一个call call ds:AdjustTokenPrivileges 通过查看进程的权限,判断进程是否可以对磁盘进行写操作,如果没有,则查找相关权限的LUID,赋予该进程相应权限,具体不再赘述。
(3)模块2分析
前面模块一中介绍的是进程提权部分,也就是main中的第一个关键点 call sub_401000 , 下面来看一下main中第二个关键点:
在第一个 call sub_401000 这个子模块中,一共两个参数压栈
[Asm] 纯文本查看 复制代码
1
2
push
1
push
offset
aSedebugprivile
在函数结束时,需要将堆栈还原,32位的两个参数正好8个字节,因此 Add esp ,8, 让栈顶指针增加8字节,栈在开辟储存空间是向下增长的。 堆栈平衡以后,程序直接无条件跳转到 sub_401090处,在IDA中直接双击,切换到 sub_401090处,为了看着比较直观,先来看一下整体视图, 如图 4-4, 4-5所示:
图4-4 IDA sub_401090 处代码图
图4-5 IDA 检测写入数据图
通过对main中第一个call模块进行分析,病毒程序已经提升进程权限,对于下一步,估计会对硬盘进行写入操作。刚切换到sub_401090位置,并不知道到程序会怎么做,大致浏览一下代码,会发现\\\\.\\PHYSICALDRIVE0 字样,这也说明不了什么,只能说明有可能是想获取本地磁盘的信息,但是下面还有所发现,看如下几行代码,主要介绍CreateFileA函数
[Asm] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
push
0
rep
stosd
stosw
push
0
push
3
stosb
push
0
mov
ecx
, 0Ch
mov
esi
,
offset
unk_406030
lea
edi
, [
esp
+220h+Buffer]
push
3
push
0C0000000h
rep
movsd
push
offset
FileName
mov
[
esp
+22Ch+var_2], 55h
mov
[
esp
+22Ch+var_1], 0AAh
call
ds
:CreateFileA
调用函数55h 0AAh 这个对磁盘主引导区比较熟悉的应该知道,这是磁盘主引导扇区(MBR)的结束表示,一般是第一扇区的511和512字节处,就像PE文件头的标识00004550一样,以上汇编代码中,其实只是实现了一个功能就是在磁盘下创建文件,从参数7到参数1是CreateFileA函数的7个参数,顺序也按照调用顺序进行排列,具体参数就不再细说了,调用CreateFileA函数取得设备句柄(这个设备句柄后面会用到),通过对返回值进行检测,判断函数是否成功,成功的话进行进一步操作,如下汇编代码:
[Asm] 纯文本查看 复制代码
1
2
3
mov
esi
,
eax
cmp
esi
, 0FFFFFFFFh
jnz
short
loc_4010F4
这里将函数的返回值储存在esi中,也就是设备的句柄,具体有什么用处,继续往后边分析。一个jnz条件跳转指明了一个方向,对于这个跳转与否,在IDA中有两个方向,如图4-6所示:
图4-6 IDA jnz short loc_4010F4 解释图
如果文件创建成功则跳转至loc_4010F4处,否则执行另一块操作,此时为了清晰地看一下程序的运行细节,将病毒程序载入到OD中,如图4-7所示,
进行分析。
图4-7 OD jnz short loc_4010F4 解释图
载入OD后,ALT+C到CPU界面,右键查看所有字符串参考,跟以前的分析,直接双击所查找出来的\\\\.\\PHYSICALDRIVE0字符,双击进入如图4- 双击进入如图4-7的界面,然后看到CreateFile函数,在call该函数的前后下断,下软件断点就可以了,然后F9,让程序运行至第一个断点处,如图4-7红色004010D4处,然后F8单步往下走(不要F7,F7进入函数体内没有其它需要的信息,这里就不截图展示了),此时主义观擦右上角寄存器信息,注意ESI和EAX如图4-7右上角红色方框处,F8逐步将程序运行至004010E7处,可以先看ZF标志位(OD中以字母Z在右上角显示),此时也可以看到图4-7左下角出现"跳转已实现"字样,程序已经跳转至loc_4010F4处,此时留意ESI和EAX两个寄存器,此时它们的值是44h,它代表取得设备句柄成功。其实在创建设备句柄之前,要写入MBR的字符数据已经可以在内存中查到,如下代码:
[C++] 纯文本查看 复制代码
1
2
3
mov ecx, 0Ch
mov esi, offset unk_406030
lea edi, [esp+220h+Buffer]
观察上边代码,[esp+220h+Buffer]这个地址开始的数据后来被检测到包含MBR引导扇区的结束标志55H AAH,如下代码:
[Asm] 纯文本查看 复制代码
1
2
mov
[
esp
+22Ch+var_2], 55h
mov
[
esp
+22Ch+var_1], 0AAh
因此在内存中转到406030这个位置,查看数据,如图4-8所示。此时再把视线回归到IDA中如图4-3所示,既然程序跳转到loc_4010F4处,下面具来分析一下loc_4010F4处的代码,来了解病毒程序下面如何操作,上面通过CreateFile取得文件设备句柄,并将设备句柄存取到ESI中,然后进一步操作,如下代码:
[Asm] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
lea
ecx
, [
esp
+210h+NumberOfBytesWritten]
push
0
push
ecx
lea
edx
, [
esp
+218h+Buffer]
push
200h
push
edx
push
esi
call
ds
:WriteFile
调用WriteFile函数,将512字节的 数据写入hFile(即CreateFile创建的文件中)中,下面利用DeviceIoControl与设备进行I/O,上面已经创建好的设备句柄保存在ESI中,详细如下代码:
[Asm] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
lea
eax
, [
esp
+210h+BytesReturned]
push
0
push
0
push
0
push
0
push
0
push
9001Ch
push
esi
call
edi
push
esi
call
ds
:CloseHandle[
esp
+210h+BytesReturned]
push
esi
call
ds
:CloseHandle
图4-8 IDA 406030 处16进制数据数据查询图
(4)利用WinHex提取出被感染后的MBR数据
该工具里面的工具栏里面提供有打开磁盘文件扩展,可以选择以16进制或者10进制显示,如图4-9是正常情况下的MBR的内容:
图4-9 WinHex 打开磁盘扇区文件图 打开之后会显示如界面,选择物理驱动器,如图4-10所示:
图4-10 WinHex 选择操作物理驱动器图
打开磁盘文件后,选中磁盘的第一个扇区,即MBR,右键->复制模块->置入新文件保存起来,如图4-11所示:
图
4-11
WinHex
保存磁盘扇区文件图
1.1 病毒的修复 如果在分析之前对MBR有备份,这样可以容易处理一些,有一款工具叫MBRTool,可以对MBR进行简单的备份和恢复:
说明:因为本人在此领域还是新手,此次分析是在看到 willJ 大大 http://www.52pojie.cn/thread-188123-1-1.html 发的一篇分析文章后决定自己尝试一下,因为个人技术太少,刚涉足此方向,新手上路,望各位大大给予指点
免费评分
查看全部评分