hello,你们的魔*小Kevin又来了。
一个可爱帅气机智的不正经号主准时准点出现在每个你期待的夜晚!文章来源:疯猫网络
初始载荷信息攻击的初始载荷是一个文件名为双后缀名的文件“开证装期邮件.pdf.exe”,这是一种常见的文件伪装方式,利用Windows的扩展名显示设置(“隐藏已知文件类型的扩展名”)伪装真实的.exe后缀,再选择高级自解压选项中自定义自解压文件图标,选择让exe文件看起来像PDF文档,诱骗用户打开。不过由于自解压格式的图标来源于文件,而不是系统自带的图标:时常出现画风不同的C位出道场面(一看就是自带剧本的):VT搜索该文件MD5可以看到有5/69的高检测率,匹配的YARA规则名可以解释为隐藏为PDF的SFX自解压文件:SFX自解压文件,是一种压缩软件生成的exe文件,拥有执行后可以解压释放文件并执行的特性,通常被病*文件用来捆绑掩饰文档或其他白文件进行伪装。可将文件后缀改为rar,使用压缩软件打开,查看其中的文件和相关代码和解压,或者在文件属性的注释中也可以看到。如本文中的样本运行后会在“C:\intel\logs”路径下释放“dlhost.exe”并执行:直接双击运行exe使初始载荷在指定路径下释放文件也行,多一个步骤要找一下文件。一般来说解压比较方便,但是有些样本会检测是否在设置的目录下运行,不是则退出,分析时需注意这一点(本文样本无此检测)。有效载荷dlhost.exe结论先行,带入结论看内容比较容易看进去。“dlhost.exe”经过分析后发现为APT组织蔓灵花常用的下载器,用来收集受害者计算机信息和创建套接字通信从远程服务器下载插件完成其他功能的操作。在分析之前,建议先做一些准备工作,磨刀不误砍柴工~去除随机基址由于PE的特性,程序有基址随机化的问题,那么在分析前,需要查看并修改为不随机的情况,便于下断点分析后调试的配置文件(.udd)在重新运行后还能生效。方式有多种,比较简单的是使用Editor查看PE文件,将在PE结构中有字段“(NtHeader→OptionalHeader→DllCharacteristics→)IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE”,如果数值为1,即开启了“基址重定位”(动态随机基址),现将其修改为0后保存文件:也可以自己写脚本或者可执行程序将其修改。查看断点如果没有特地隐藏或者处理要使用的函数的情况(可“一般”是有的),查看IDA的导入表窗口中显示的函数,可以推测出一些功能,发现有:套接字通信的函数,那么存在套接字通信(好绕):.文件操作函数,包括创建/打开、读取和写入等。可以推测有创建文件、读取文件、移动文件等操作:.获取信息操作:那么此时可以通过导入表有个初步的判断,这是一个有获取计算机和用户信息,并且有文件操作的联网恶意软件——基本上已经可以推测出这是下载器或文件窃取器了。反调试一般来说恶意软件都会有反调试功能,反调试的方向也分多类,如:探测Windows调试器、识别调试器行为、干扰调试器的功能等。在《恶意代码分析实战》第16章反调试技术、《逆向工程核心原理》第51章静态反调试技术第5章动态反调试技术都有详细介绍,一般工作中遇到“Sleep”和“IsDebuggerPresent”比较多。本样本虽无干扰调试的“Sleep”,但有检测调试环境的“IsDebuggerPresent”,问题不大,“15PBOD”的插件大礼包中“HideDebugger”已将该函数的返回值HOOK,即反反调试(狗头):对API下断并检查将样本拖入OD后,对敏感API函数下断,如:套接字通信中发送数据的“send”;文件操作的“CreateFileW”、“ReadFile”和“WriteFile”;用于执行恶意载荷或命令的“ShellExecuteA”等。接着可以“Alt+B”或菜单栏下的“B”(Break,断点之意),查看已下的断点想取消断点时从这里也可以快速的找到:查看后“Alt+C”或菜单栏下的“C”,可返回反汇编窗口。查看函数调用返回后可以使用右键“查找”功能中的“所有模块间的调用”,查看有无异常情况(那当然是有的):大事不妙!异常就是大量调用动态获取函数地址的“GetModuleHandleW”+“GetProcAddress”,这是一种常见的规避检测的方式,并且也是一种反静态分析手段:在IDA处找到对应的函数或代码后,使用IDA的脚本功能(Shift+F):使用IDA的重命名函数“MakeNameEX”编写的命令“MakeNameEx(longea,stringname,longflags);”。可以用Notepad++/Excel等编辑工具或Python/BAT脚本,将命令批量化处理后如下,复制粘贴后RUN:将地址进行重命名,便于静态分析:出现个别因为已有该名称所以冲突不能重命名的单独重命名N键一下即可:调试运行IDA导出表可以查看到主函数“Start”地址,下断后F9可直接运行到断点处,进行调试分析。解密操作在IDA界面还可以发现比较重要的功能代码在函数C80处,其中有大量的if+DoWhile循环解密(解密方式-=0xD),问题不大,在解密函数完成后的那行代码下断:此处建议看看解密出的内存都是什么数据,如果发现特殊的字符串或数据需要特地跟踪一下。比如此样本中解密的部分数据就很明显包括注册表路径、外连的URL字符串、和一串疑似指令的字符串“Yesfile”。这其实就是解密出了配置文件:环境检测如上上图所示,解密后就调用“CreateSemaphoreA”创建信号量“7t56yr54r”,接着调用“GetLastError”检测信号量是否创建成功,如果错误码为定义“ERROR_ALREADY_EXISTS”的18(0xB7),即代表内存中已存在运行中的该进程,那么其后续的函数40C4必然是退出进程函数(或者有可能进入扰乱分析或者伪装功能的代码):通常恶意的可执行文件会通过CreateMutex创建互斥体或CreateSemaphore创建信号量(蔓灵花该下载器都是用信号量)+“GetLastError”获取错误码的方式让恶意进程在内存中保持唯一运行的状态,避免互相干扰。那么由此可以逆推,其实主要的功能代码,一般是在判断完互斥体或信号量后的部分(或者其他检测行为后)。时间比较紧迫的情况,可以考虑定位到检测+“GetLastError”后,“if”判断不成立的逻辑条件进行分析。由于本人调试分析时,常利用火绒剑等监测工具监测后台运行的该进程,故“GetLastError”的返回值为0xB7,此步可以通过修改寄存器的ZF标志位跳过此步跳转:网络行为初始化操作和解密操作等非恶意功能代码比较多,先用IDA找比较重要的函数分析,再用OD按F4到CALL行查看其传入的参数,如外连“