恶意代码分析实战19-03

Posted Neil-Yale

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了恶意代码分析实战19-03相关的知识,希望对你有一定的参考价值。

本次实验我们将会分析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文档。

以上是关于恶意代码分析实战19-03的主要内容,如果未能解决你的问题,请参考以下文章

恶意代码分析实战3-2

恶意代码分析实战3-2

恶意代码分析实战11-1

恶意代码分析实战9-1

恶意代码分析实战14-02

恶意代码分析实战11-2