问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
记一次HW样本分析
HW中遇到的样本
0x01 20113852 @C.exe ==================== 原始样本使用UPX加壳,需要脱壳分析。  1.1 修复程序 -------- 首先程序不是从main函数开始,而是从Strat开始,从exports可以看出。  进入start后出现两个函数,一个是类似CANARY的一种防御缓冲区溢出攻击的手段,重点是第二个函数。  进入`__scrt_common_main_seh`函数,首先做了两个结果判断。  进入`__scrt_initialize_crt`查看。  `sub_5B3F24`通过`IsProcessorFeaturePresent`判断CPU的信息。  `sub_5B3C1B`返回值1,因为调试器会在第一个调用处设置断点,导致子函数第二次被调用时返回0,所以是一种反调试技术,来达到退出或终止调试的目的。   第二个函数`__scrt_acquire_startup_lock`实现了自旋锁功能。  接着看下一个函数`sub_5B3C83`。  也是反调试,通过`IsDebuggerPresent`检测是否被调试。  如果被调试就退出程序。  如果不是调试,就在执行一系列操作之后进入main函数。  自此,逻辑就清楚了,那么修复程序,只需要将`goto LABEL_20`的时候改成跳转到`get_initial_narrow_environment`就行。因为main函数需要三个参数:`v8`、`v9`、`v10`,而这几个函数不需要传入其他参数,所以我们跳转到`v8`就行。  首先找到`goto LABEL_20`的地址为`005B362A`。  接着找到`v8`的地址为`005B36F2`。  打开x32dbg,`ctrl+g`跳转到`005B362A`下断点。  F9执行到断点,将命令改为`jmp 0x005B36F2`。  ctrl+p修补文件。  1.2 main -------- IDA可以看到main函数的地址是`005B3709`。  程序main函数前半段会解密出一个程序内嵌的dll,`xor key`为`0x70AB96A`在`To_Big_Function`中以字符串拼接的方式组合出原始的内容,然后在`sub_404920`中先`string`转`int`,在右移三位,与key异或,最后传入`sub_405B60`中的两个参数分别为dll的`buffer`和`length`。  ### 1.2.1 main→To\_Big\_Function\_4063F0 字符串拼接的方式组合出原始的内容。  ### 1.2.2 main→sub\_404920 xor解密。  1.3 dump dll ------------ 通过动态调试在内存中dump出解密后的DLL。 ### 1.3.1 0040608D下断点   运行到断点处。  ### 1.3.2 dump 寄存器eax是文件开始的地址,edx是长度。 - LoadLibraryA等函数加载DLL到内存时,会返回加载的DLL在内存中的起始地址,该返回值通常存放在eax寄存器中。 - DLL或其他文件的大小长度参数也经常通过调用约定存在edx寄存器中。 dump命令:`savedata "E:\\1.dll",00A9BEC0,0019FF0C`。  在日志中可以看到写入成功,文件夹中可以看到保存的1.dll文件。  之后大马做的就是调用DLL中的导出函数`CustomFunction`。  接下来看看1.dll。 0x02 1.dll ========== 先shift+F12从字符串开始看。 DLL中存在BlackMoon等关键词,说明是使用黑月编译器编译的易语言程序。  一些原始信息,如DLL名为NCJZ.dll,编译日期为2023年8月15日12点。  HTTP相关字符串。  通过交叉引用,找到DLL中的网络数据请求相关代码。  现在回到刚才dump的地方,F8让程序从内存加载dll。  然后从符号表中找到`WinHttpConnect`下断点。  运行到断点,可以看到从远端下载。 aliyundownyi.oss-cn-hongkong.aliyuncs.com/libcef.exe aliyundownyi.oss-cn-hongkong.aliyuncs.com/libcef.dll  0x03 libcef.dll =============== 根据经验,既然已经下载了下一层payload,且存在exe程序,那此二层DLL后续的动作应该就是启动三层exe(libcef.exe)。 而三层exe又在导入表中依赖三层DLL,因此我们先看DLL。  DLL用aspack加壳,需要手动脱壳后分析。这个脱壳就不说了,老版ESP定律直接定位OSP。 0x04 libcef.exe =============== 将脱壳后的dll重命名为libcef.dll,放在libcef.exe同一目录下。 在隔离环境中运行三层样本时会发现网络数据请求。  因此我们使用调试器并将断点放在`connect`函数上,观察调用栈。   可以看到一个奇怪的地址,这个地址不属于任何模块,非常明显的shellcode特征。     关闭其他断点,只留下该地址的硬件断点。  重新启动程序,可以看到断点断在了libcef.dll中。  4.1 IDA和xdbg基址同步 ---------------- libcef.exe中加载的libcef.dll的地址为`0x6EB00000`。  在IDA中更改地址。  4.2 shellcode ------------- 在脱壳后的libcef.dll查看调用地址附近的代码,发现样本使用AES加密shellcode。   双击dword查看,如下分别为数据长度、AES密钥:`JqZpcsR4FX4X0nBG`、待解密内容。  解密方式为AES-ECB,可以在线静态测试。  4.3 dump shellcode ------------------ 内存中dump的方式获取4层DLL。 解密函数地址:`6EB05BE6`。  跳转到该地址,执行解密函数后,dump shellcode。  dump命令:`savedata "E:\\shellcode.dll",6EE5A428,0x17A400`  libcef.dll会调用这个dll中的`fuckyou`导出函数。  0x05 shellcode.dll ================== 功能如下: 创建windows服务,名称为`Ykamgo soouukua`。  获取系统信息、网络连接、执行命令、权限维持、修改注册表等等。 
发表于 2023-09-05 09:00:00
阅读 ( 12646 )
分类:
漏洞分析
15 推荐
收藏
3 条评论
江南小虫虫
2023-09-05 11:04
师傅tql,带带我
请先
登录
后评论
小小文生
2023-09-05 11:10
很详细的分析过程
请先
登录
后评论
252525
2023-09-05 11:18
大佬666,写得很详细
请先
登录
后评论
请先
登录
后评论
鹿柴
2 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!