攻击技术研判|DRIDEX木马巧用VEH混淆API调用流程
2021-11-08 12:05:55 Author: www.freebuf.com(查看原文) 阅读量:25 收藏

情报背景

DRIDEX是自2014年起活动至今的著名恶意银行木马家族,通常以OFFICE文档的方式进行文档钓鱼攻击。0xCERT的研究人员将其描述为精于防御规避的信息与凭据窃取恶意软件,利用众多C&C服务器令针对其的网络·封锁无能为力。DRIDEX在其历史行动中曾多次运用高级防御规避技术隐匿其恶意行为,其v4版本是第一个使用AtomBombing进程注入技术的恶意软件。

而本文中将对其近期样本中利用向量化异常处理(VEH)机制混淆其API函数调用的手法进行分析研判,该手法对于动态静态分析均有较好的对抗效果。

组织名称

Indrik Spider

关联组织

Evil Corp

战术标签

防御规避

技术标签

反调试、向量化异常处理

情报来源

https://www.0ffset.net/reverse-engineering/malware-analysis/dridex-veh-api-obfuscation/

01 攻击技术分析

亮点:利用VEH进行API调用混淆

关于向量化异常处理(VEH)

向量化异常处理(VEH)是结构化异常处理(SEH)的扩展,VEH的优先级先于SEH,且不依赖栈结构,而是以双链表的形式保存在堆中。应用程序可通过AddVectoredContinueHandler函数注册异常处理函数来监视和处理程序所有的异常。当程序执行过程中发生异常,该异常处理函数将被首先调用以处理异常。

PVOID AddVectoredContinueHandler(
ULONG                       First, 
PVECTORED_EXCEPTION_HANDLER Handler
);

当异常处理函数捕获到异常时,将会拿到类型为EXCEPTION_POINTERS的参数。其中的ContextRecord成员保存了触发异常时的寄存器上下文,并在异常处理完成后恢复,通过修改EIP/ESP等寄存器便可劫持程序执行流程。

typedef struct _EXCEPTION_POINTERS {
PEXCEPTION_RECORD ExceptionRecord;
PCONTEXT          ContextRecord;
} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;

插入代码破坏动静态分析

开始的流程比较中规中矩,利用哈希匹配动态解析API地址放入寄存器之后,将函数参数依次推入栈中,之后调用函数。

1636340461_618892ed290b660f2d937.png!small?1636340466042

而DRIDEX独居匠心之处则是未使用call指令直接调用函数,而是使用“int3+retn”的组合完成函数调用。这是一种一箭双雕的反分析手段:通过插入int3断点实现反调试、利用retn指令破坏程序静态函数分析。

正常执行流程下int3指令会触发异常,进入到VEH处理函数中完成最终的跳转。而当程序被动态调试分析时,int3断点异常会被调试器捕获并中断,给程序分析带来阻碍。分析者必须理解DRIDEX的反调试意图,对插入的指令进行恰当的处理,增加了动态分析的成本。

而插入的retn指令则会使ida等反编译工具将retn地址视为函数的结尾,忽略剩余的函数执行流程(如下图,对返回值的检查及后续跳转被反编译器忽略了)。

1636340489_618893095724b00db5c90.png!small?1636340494331

精巧设计的VEH跳转流程

DRIDEX通过动态解析获取AddVectoredContinueHandler的地址之后,将sub_687D40注册新的VEH异常处理函数。这意味着代码段中被插入的int3指令被执行时,异常将被捕获并交由该函数处理。

1636340537_61889339d829f91aac8e2.png!small?1636340542773

该异常处理函数会通过传入的ExceptionRecord的传入参数获取异常类型,若是断点导致的异常则将异常交由下一个异常处理函数。在接下来的异常处理过程中,DRIDEX读取存储于ContextRecord中的eax寄存器值(保存之前被解析的API地址),将其置于栈顶,并将EIP指向int3之后的retn指令。

1636340565_61889355909b306181c3b.png!small?1636340570457

当寄存器的篡改操作完成后,函数返回EXCEPTION_CONTINUE_EXCUTION,使得程序以被修改的上下文继续执行。当retn执行被执行时,被解析的API函数地址从栈顶弹出并跳转,完成一次隐蔽的API调用过程。

1636340602_6188937aefda7e3d547f1.png!small?1636340607891

总结

DRIDEX在本次活动中利用向量化异常处理(VEH)对其调用API的行为进行了隐藏,在对抗动静态分析方面起到了较好的效果。但其异常触发与异常处理函数中的流程还较为简单,导致研究者可通过编写patch脚本等方式对函数调用流程进行修改,复原其原始逻辑。

向量化异常处理的利用潜力远不只如此,更加灵活地对其进行利用,可以在不修改程序代码段的前提下对整个程序的执行流程进行篡改,实现更加复杂的反调试反分析技巧。

绿盟科技 M01N Team 战队

绿盟科技M01N战队专注于Red Team、APT等高级攻击技术、战术及威胁研究,涉及Web安全、终端安全、AD安全、云安全等相关领域。通过研判现网攻击技术发展方向,以攻促防,为风险识别及威胁对抗提供决策支撑,全面提升安全防护能力。


文章来源: https://www.freebuf.com/articles/network/303960.html
如有侵权请联系:admin#unsafe.sh