为什么shellcode分析很难

2025-04-09 18:53:42
推荐回答(1个)
回答1:

获取额外资源
很多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.