为啥shellcode分析很难

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥shellcode分析很难相关的知识,希望对你有一定的参考价值。

参考技术A 获取额外资源
很多shellcode是分阶段(staged)的,比如首先有一个shellcode准备环境,请求和获取进一步实现更多功能的代码,再可能再进一步注入更多可能的程序。这些shellcode如果不能获取额外的资源也许就悄悄退出了,不会出现明显的恶意行为。
需要特殊的上下文
写过程序的人都知道,代码环境是非常重要的。shellcode是针对特定软件和版本的运行环境进行攻击,往往在其他环境中根本不起作用,也就表现不出恶意行为。
处理恶意行为并不容易
shellcode是为了入侵机器并执行想要执行的程序而生。那么。。。分析环境自身也许就已经被shellcode控制。这时候,你的分析环境需要回滚吗?你的分析结果可信吗?它是不是只留下了一个隐蔽的后门
性能问题
尽管shellcode看起来很短只有几百个字节,可能等到恶意行为触发却要运行很久很久。可能有很多循环要运行成千上万遍。这对任何分析系统比如模拟器沙箱什么的都是挑战,通常只能在有限时间内检测样本。
ps:两年前为了绕过杀毒软件对metasploit生成的exploit的查杀,就使用了 简单的loop指令 绕过了所有杀毒软件。
规避技术
恶意软件使用很多技术来让静态分析变得几乎不可能,让动态分析变得不准确(比如混淆API(之后,这个词我也许会和系统函数混着用,总之就是调用的别人的系统提供的函数)调用追踪),通过特殊的汇编技巧误导分析工具(比如用间接跳转误导IDA pro的递归下降反汇编算法)
加密/编码
大多分析样本都会加密/编码。一种简单但非常使用的 异或加密 技术非常流行,shellcode可能一个字节一个字节的动态解密,也可能四个字节(一个32位寄存器大小)。为了加密强度更高,密钥常常也通过某种方式动态变化着 。静态分析工具一般不会获得有用信息。
不常见的API调用
即使会让shellcode复杂很多,shellcode也可能使用一些不常见的API用奇怪的方式绕过简单的API来实现功能。因为分析工具往往会只分析安全相关的一小部分,会被绕过。
Windows中有很多可能连正式文档都没的API。。。(好像我不知道。。。但linux下用些动态调用方式可以用一种 很奇怪的方式调用函数 )
汇编技巧
现在讨论些普通应用没个卵用但shellcode常用来规避检测的汇编技巧:
间接API调用
假如要调用API A,则调用内部调用A的API B,通过栈传参数和跳转应该能实现,虽然我没做过。总之能干扰分析工具,掩盖真实意图。
越过挂钩(Jumping Over the Hook)
关于 挂钩技术 :函数调用挂钩实际上是改变函数指针。
这和分析工具hook原理有关,往往会通过覆盖API前几个字节。那么,shellcode中执行API中前几个字节调用时就直接跳过前几个字节。
返回导向编程(Return Oriented Programming)
ROP原理参考维基百科 ,偶尔有些会用这种方式干扰API调用追踪。以下一个简单例子是把 API_2 的地址推入栈,直接跳到 API_1 的地址。根据x86系统 ret 指令调用原理,API返回时就返回到了调用API前栈顶的地址也就是 API_2 的位置。这样偷偷就完成了 API_2 的调用而不返回shellcode自身。
ROP技术实现不返回shellcode自身的两次调用
ps: ROP技术常用来绕过越来越严格的系统安全限制 。这种技术利用被挖掘漏洞程序或环境中已有代码片段返回串联执行。有兴趣可以看看 ROPgadget Tool
总结和展望
shellcode编写并起作用是件很不容易的事情,因为它要在指定环境的各种细节泥潭中挣扎。
shellcode一旦实现又将是天马行空的,它拥有各种手段悄悄地完整入侵一台设备。
检测很难,但并非不可能。常见技术造成shellcode会有很多共性的部分。即它们最终能通过提取某些特征得到“认证”。
Just for fun, not to be so serious.

恶意代码分析实战19-01

本次实验我们将会分析lab19-01文件。先来看看要求解答的问题
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在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下载文件,将下载的文件写到硬盘,并运行它。

以上是关于为啥shellcode分析很难的主要内容,如果未能解决你的问题,请参考以下文章

关于 [栈溢出后jmp esp执行shellcode] 原理分析

恶意代码分析实战06-01

恶意代码分析实战06-01

恶意代码分析实战19-01

恶意代码分析实战19-01

pwn记一道shellcode侧信道攻击