恶意代码分析

1.IDA Pro
IDA Pro是一款交互式的,可编程的,可扩展的,多处理器的,
交叉Windows或Linux WinCE MacOS平台主机来分析程序,
被公认为最好的花钱可以买到的逆向工程利器。
IDA Pro已经成为事实上的分析敌意代码的标准并让其自身迅速成为攻击研究领域的重要工具。
它支持数十种CPU指令集
其中包括Intelx86,x64,MIPS,PowerPC,ARM,Z80,68000,c8051等等。

2.Ollydbg

一个反汇编工具,又叫OllyDebug,一个新的动态追踪工具,
将IDA与SoftICE结合起来的思想,
Ring 3 级的调试器,
己代替SoftICE成为当今最为流行的调试解密工具了。
同时还支持插件扩展功能,是目前最强大的调试工具。
基本上,调试自己的程序因为有源码,一般用vc,破解别人的程序用OllyDebug。

bin文件

学习如何分析shellcode。
本次实验只给出了bin文件,我们将会学习它是如何解码出真正的指令的,
并且为了能够进一步在ollydbg中进行分析,我们将会从中提取shellcode并使用vc++6.0编译为可执行文件,此外我们还会使用kali中的sctest来模拟shellcode进行分析。

在这里插入图片描述
在这里插入图片描述

辅助工具:IDA,vc++6.0,ollydbg

Lab19-01.bin文件请在kali上下载使用:http://tools.hetianlab.com/tools/T078.zip

Q1.这段shellcode是如何编码的?

Q2.这段shellcode手动导入了哪个函数?

Q3.这段shellcode和哪个网络主机通信?

Q4.这段shellcode在文件系统上留下了什么迹象?

Q5.这段shellcode做了什么?

载入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在/桌面/tools/chapter19-scripts/)
在这里插入图片描述

然后将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下载文件,将下载的文件写到硬盘,并运行它。
在这里插入图片描述在这里插入图片描述

分析恶意pdf文件

实验目的
本章的实验我们学习如何分析shellcode。
本次实验我们将会学习使用PDFStreamDumper, pdfid等工具分析恶意pdf文件,
期间会进一步分析内嵌其中的JavaScript脚本明确是利用了什么漏洞进行attack。
为了进一步明确恶意代码的行为,
我们使用scdbg以及sctest生成调用流图辅助进一步的分析。

2.scdbg。

scdbg是一款多平台开源的Shellcode模拟运行、分析工具。
其基于libemulibrary搭建的虚拟环境,
通过模拟32位处理器、内存和基本Windows API运行环境来虚拟执行Shellcode以分析其行为。

PDFStreamDumper

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文档。

x86指令 虚拟机 检测

本章的实验我们着重关注恶意代码的反虚拟机技术及相应的对抗方法。
在本实验中,
我们将会学习恶意代码如何使用特殊的x86指令实现虚拟机的检测,
涉及的指令包括sidt,str等。
在此过程中,我们会使用IDAPython脚本辅助我们进行分析。
需要注意的是,由于实验室的虚拟机环境原因,
本次实验的恶意代码采用的反虚拟机技术实际上不会起到效果,
但是其采用的技术以及我们针对性的对抗措施都是值得学习的。

辅助工具:IDA,

实验任务
本次实验我们将会分析Lab17-01.exe文件。先来看看要求解答的问题

Q1.这个恶意代码使用了什么反虚拟机技术?

Q2.使用IDAPro,运行IDAPython脚本(提供的findAntiVM.py),看它发现了什么?

Q3.每种反虚拟机技术成功执行后会发生什么?

Q4.针对你的虚拟机,这些反虚拟机技术中哪些技术会生效?

Q5.为什么每个反虚拟机的技术,会生效或失败?

Q6.怎么使这些反虚拟机技术无效,从而让恶意代码运行?

实验步骤一
IDA载入文件,运行findAntiVM.py来自动查找存在漏洞的x86指令
在这里插入图片描述

File->script file,选择该脚本
在这里插入图片描述
在这里插入图片描述

输出窗口的结果如下所示
在这里插入图片描述

由上图可知检测到了三条漏洞指令的类型

Q2.使用IDAPro,运行IDAPython脚本(提供的findAntiVM.py),看它发现了什么?

A2.这个脚本发现了三个可能的反虚拟机指令sidt、str和sldt,
在这里插入图片描述在这里插入图片描述

在这里插入图片描述
双击00401121,在IDA view-a可以看到红色高亮显示的sldt指令
用红色对它们进行了高亮显示。
在这里插入图片描述

另外的也是同样可以看到
在这里插入图片描述

sidt指令

str指令

我们依次分析

先来看sldt

sldt指令也称为no pill,是一种反虚拟机技术

在这里插入图片描述

可以看到var_8被eax赋值,而eax来自dword_406048
在这里插入图片描述

dword_406048是一个初始化常量
在这里插入图片描述

sldt指令的结果被存入var_8,
在这里插入图片描述
通过一些列mov最后赋给了eax
在这里插入图片描述

我们看看sldt所在的函数sun_401100的交叉引用
在这里插入图片描述

跟入在这里插入图片描述

在这里插入图片描述

 X键

在这里插入图片描述

在这里插入图片描述

可以看到sub_401100的返回值在eax,会与0xddcc0000比较,在这里插入图片描述

在这里插入图片描述

其实就是用于检查初始常量的低序比特位是否被设置为0

如果不是0,则执行跳转,跳到loc_40132b
在这里插入图片描述

之后就退出了
在这里插入图片描述

这样就不会走另外一个创建线程的分支
在这里插入图片描述
在这里插入图片描述

在od中,在4012d6下断点,然后执行
在这里插入图片描述

在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在右边可以看到此时EAX为ddcc0000,说明虚拟机检测失败
在这里插入图片描述
在这里插入图片描述

接下来看下第二条

在这里插入图片描述

可以看到会将sidt结果中最重要的四个字节存入var_420
在这里插入图片描述

在004011e3处,sidt的四个字节被移位。

移位之后,就是sidt的第五个字节与0xff(vmware的特征)比较。
在这里插入图片描述

如果比较成功,那么恶意代码检测到了虚拟环境,则会实现跳转

而跳转的目的地40132d是调用了sub_401000

在这里插入图片描述

可以看到该函数是用于删除自身并终止进程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

我们可以在od中测试下
在这里插入图片描述

在4011e6下断的地方查看ecx
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

此时ecx并不是0xff,说明在我的环境中这种检测是失败的,这是因为我是在多核的虚拟机上进行实验
在这里插入图片描述

那么理所当然的,单步之后,跳转也是无法实现的
在这里插入图片描述

再来分析第三处

在这里插入图片描述

str指令将任务状态段TSS载入到一个四字节的本地变量var_418中
在这里插入图片描述

在调用GetModuleFileName后,该变量才会被使用

如果匹配VMware特征码,则00401235的结果为0,00401244的结果为0x40
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如果str指令成功执行,则下图所示,恶意代码不会创建MalServive服务
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

 	否则 就执行 malservice服务

在这里插入图片描述

我们在od中40122f下断点,执行
在这里插入图片描述

此时edx值为0x28,而不是0x40(vmware的特征码)
在这里插入图片描述

说明在我的环境中这个检查还是失败的

Q1.这个恶意代码使用了什么反虚拟机技术?

A1.恶意代码用存在漏洞的x86指令来确定自己是否运行在虚拟机中。

Q3.每种反虚拟机技术成功执行后会发生什么?

A3.如果sidt指令或者str指令探测到虚拟机,恶意代码将会删除自己。
如果sldt指令探测到恶意代码,恶意代码将不创建主线程就退出,但是它将会创建恶意服务MalService。

Q4.针对你的虚拟机,这些反虚拟机技术中哪些技术会生效?

A4.针对我们的机器而言,所有的反虚拟机技术都未成功。
技术是否会生效会随着使用软硬件的不同而不同。(在实验室的环境里是不会生效的)

Q5.为什么每个反虚拟机的技术,会生效或失败?

A5.在分析过程中已经给大家解释了,不再重复。
单核 VMware 虚拟化

Q6.怎么使这些反虚拟机技术无效,从而让恶意代码运行?

A6.可以用NOP替换sidt和str指令,或者在调试恶意代码时,实时改变跳转标志。

vmware—>Dll注入恶意分析

实验目的
本章的实验我们着重关注
恶意代码的反虚拟机技术及相应的对抗方法。

在本实验中,我们将会学习恶意代码
如何实现magic数比较、
查询vmware在虚拟机与宿主操作系统之间的虚拟I/O端口等高级技

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值