网易首页 > 网易号 > 正文 申请入驻

浅谈海莲花某样本反混淆

0
分享至

作者:houjingyi

前言

先说一下样本是我在2017年分析的,2019年我又完善了一下用到的反混淆脚本。我做过一年多的样本分析,也没有分析过比这更复杂的。
1.ESET的分析:https://www.welivesecurity.com/wp-content/uploads/2018/03/ESET_OceanLotus.pdf
样本分析的很详细,不过只提了一点点样本混淆的手法,也没有提怎么做反混淆。
2.checkpoint的分析:https://research.checkpoint.com/deobfuscating-apt32-flow-graphs-with-cutter-and-radare2/
主要就是讲怎么做反混淆,开源了一个Cutter和Radare2的插件,能去除一些混淆。没有对样本进行分析。
我当时自己是写了一个基于capstone的python反混淆脚本去除垃圾代码并还原控制流,虽然代码写的很烂,用的方法也很烂,但是自己也不会再做这方面的工作了,与其烂在硬盘里不如和大家分享一下。时间有点久,有些东西记不清楚了,正文里面如果有说错的地方希望读者能多多包涵。
这里先说一点题外话。以前刚刚干这一行的时候听别人说安全是一个体力活,是人与人之间的对抗。当时不懂,后来才好像有一点理解是什么意思。比如说做样本分析,在样本分析师和样本的作者水平相同的情况下,样本的作者用了10天的时间一共x种方法混淆这个样本,样本分析师想要完全反混淆去还原这个样本就要一个一个去还原这x种方法,花的时间一定是大于10天的(当然样本分析师通过经验积累能越来越熟练)。如果一个CTF比赛,出题人花几周甚至更长的时间用了很多种混淆方法写一个壳,做题的人需要在几天的时间内拿到flag,那不出意外也没有人能做出来。

正文

接下来讲解一下反混淆脚本的流程。
首先capstone会把switch的jumptable识别为代码,所以我在脚本中标记了这些jumptable的地址。

将jumptable全部patch成0x90,调用capstone的disasm方法反汇编,将结果保存在名为read_code的dict中。dict的key是指令的地址,value记录了指令的长度,上一条指令的地址(第一条指令上一条指令的地址是0),指令的地址,指令的内容,指令的操作数和指令的助记符。并且为了方便我将所有jmp eax这样jmp一个寄存器的指令中的jmp改成call。

样本中插入了很多像下面这样的垃圾指令:

有pushfd+垃圾指令+popfd这样的,也有pushfd+垃圾指令+popfd+垃圾指令+popfd或者pushfd+垃圾指令+pushfd+垃圾指令+popfd等等情况。还有pushfd之前和popfd之后可能也会有少量的垃圾指令,在expand_pushfd_popfd函数中把这些垃圾指令也尽量都考虑进去。最后将结果保存在名为junk_code_pair的dict中。dict的key是垃圾指令的起始地址,valve是垃圾指令的结束地址。用名为junk_code的dict对垃圾指令进行标记,dict的key是指令的地址,valve为1表示该指令是垃圾指令。

不过有一些特殊的情况需要处理。
1.有时pushf之前和popf之后有一对相反的条件跳转:
pushf之前:

popf之后:

以上图为例,这个时候需要把0x291C85D处的js改成jmp,并且将0x291C863-0x291C8D5之间的指令标记为垃圾指令。

2.有时pushf之前有一条push 0xAAAAAAAA或者mov dword ptr [esp], 0xAAAAAAAA这样的指令,popf之后是一个retn:

pushf之前:

popf之后:

这个时候直接改成call 0xAAAAAAAA。把新创建的call保存在名为new_call的dict中。

还要考虑push 0xAAAAAAAA+垃圾代码+push 0xBBBBBBBB+垃圾代码+retn+垃圾代码+retn这样的情况。这时候会先执行0xBBBBBBBB处的代码再执行0xAAAAAAAA处的代码,而改成call指令之后会先执行0xAAAAAAAA处的代码再执行0xBBBBBBBB处的代码。所以需要修正。

接下来需要恢复程序的控制流,程序的控制流被打乱是因为插入了很多jmp导致IDA Pro反编译F5效果不好。先标记所有的jmp。一共有四种jmp,第一种是jmp +5这样无意义的jmp(值为-2),第二种可能是死循环的jmp(值为-1或者大于1),第三种是jmp一个寄存器(值为0),第四种是正常的jmp(值为1)。对于死循环的情况,比如说0x1000处的指令是jmp 0x2000,0x2000处的指令是jmp 0x1000,那么这两个jmp的标记都是2;再比如说0x3000处的指令是jmp 0x3000,那么这个jmp的标记就是-1。做标记的目的是为了防止处理时陷入到死循环里面。

比如说0x1000处的指令为jmp 0x2000,0x2000处的指令为XXX,0x2010处的指令为jmp 0x3000,0x3000处的指令为YYY,0x3010处的指令为jmp 0x4000,0x4000处的指令为retn。那么我的想法是将0x1000处开始的指令改成XXX,YYY和retn,避免出现过多jmp的情况。这里还有一个小细节是需要把两个字节的条件跳转和非条件跳转改成5/6个字节的,因为原来的字节很可能已经不够用了。

在process_read_code函数中调用deal_jmp函数恢复了控制流,跳过了垃圾代码,整理好的代码放在了和read_code类似的名为write_code的dict中。这个过程中得到一个名为code_mapping的dict,key是read_code中指令的地址,valve是该指令被写到write_code中的地址的列表。接下来调用process_write_code函数根据code_mapping修正write_code中指令。

除了指令需要修正以外别忘了数据也需要修正。这样基本就是我的反混淆脚本的整个流程了。

结论

最后我们来看一下处理完之后的效果,一些函数已经基本恢复出来了:
磁盘相关:

注册表相关:

如果不做处理是不可能F5得到这样的比较清晰的结果的。再多说一句,shellcode中恢复Windows API名我以前讲过一些方法:XKungfoo2018:2017年恶意代码威胁回顾和快速分析实践
不过要分析到ESET报告里面那个程度可能还需要对脚本进行完善或者动态调试,还得花一些时间,因为其实还有一些函数是没有恢复出来的,后来不做样本分析以后我也不想继续在这件事上浪费时间了。
最后给出代码和bin文件:https://github.com/houjingyi233/APT32-deobfuscation

欢迎登录安全客 -有思想的安全新媒体www.anquanke.com/加入QQ交流群1015601496 获取更多最新资讯

原文链接:https://www.anquanke.com/post/id/242672

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
乌克兰袭击通往克里米亚的大桥,这是有大动作?

乌克兰袭击通往克里米亚的大桥,这是有大动作?

山河路口
2026-06-07 18:06:11
记者:皇马本次选举成为皇马历史上总投票数最多的一次

记者:皇马本次选举成为皇马历史上总投票数最多的一次

懂球帝
2026-06-07 23:22:10
学校证实:涉事男学生已被开除

学校证实:涉事男学生已被开除

最江阴
2026-06-06 17:50:33
055和基洛夫并排的对比图,我才惊觉军舰设计已经隔了一个时代

055和基洛夫并排的对比图,我才惊觉军舰设计已经隔了一个时代

安安说
2026-06-02 12:46:29
葡萄牙不演了 C罗首发3射哑火+超低分 队长离场后连入2球击败智利

葡萄牙不演了 C罗首发3射哑火+超低分 队长离场后连入2球击败智利

智道足球
2026-06-07 07:05:07
《奥德赛》烧光17亿,被定为限制级,将影响内地同步上映

《奥德赛》烧光17亿,被定为限制级,将影响内地同步上映

光影新天地
2026-06-07 13:43:23
刘纪鹏:2026年股民“保命”建议!4000点后A股逻辑彻底变了

刘纪鹏:2026年股民“保命”建议!4000点后A股逻辑彻底变了

徐sir财经
2026-06-07 16:24:04
6年了,郭麒麟的反击几乎断送了朱亚文的演艺生涯

6年了,郭麒麟的反击几乎断送了朱亚文的演艺生涯

小熊侃史
2025-12-25 11:24:12
A股:美股科技股暴跌!明天开盘怎么走?给散户3个保命忠告!

A股:美股科技股暴跌!明天开盘怎么走?给散户3个保命忠告!

猫叔东山再起
2026-06-07 13:37:44
我在英国吃了半个月白人饭,回国才恍然大悟:中国人的胃早养刁了

我在英国吃了半个月白人饭,回国才恍然大悟:中国人的胃早养刁了

老特有话说
2026-06-06 20:54:44
太突然!东莞40年老牌餐饮店结业了!

太突然!东莞40年老牌餐饮店结业了!

东莞好生活
2026-06-07 16:48:09
12:4!选举结果出炉,74 岁的朴槿惠重出江湖,李在明顺利过关!

12:4!选举结果出炉,74 岁的朴槿惠重出江湖,李在明顺利过关!

共工之锚
2026-06-08 00:26:40
“西安麻辣烫姐”的瓜:英国博主在中国24小时,成功交到女朋友并直播开房!来之前就预料到会成功

“西安麻辣烫姐”的瓜:英国博主在中国24小时,成功交到女朋友并直播开房!来之前就预料到会成功

潇拾亿郎
2026-06-07 21:45:35
2-1!巴西大轮换仍斩落世界第29 19岁皇马红星制胜 巴黎队长送礼

2-1!巴西大轮换仍斩落世界第29 19岁皇马红星制胜 巴黎队长送礼

我爱英超
2026-06-07 08:32:22
今晚 AI又乐观了....

今晚 AI又乐观了....

新浪财经
2026-06-07 23:39:30
多座城市酒店频频中招?大批印度游客入境,却全程零消费、不住店

多座城市酒店频频中招?大批印度游客入境,却全程零消费、不住店

西楼知趣杂谈
2026-06-07 20:00:55
78万广东家长缺席“陪考”,高考在广东为何变得没有“仪式感”呢

78万广东家长缺席“陪考”,高考在广东为何变得没有“仪式感”呢

王姐懒人家常菜
2026-06-07 14:50:26
意媒:意大利派超年轻首发上场,总身价仅为2.4亿欧元

意媒:意大利派超年轻首发上场,总身价仅为2.4亿欧元

懂球帝
2026-06-07 18:03:09
一旦核战爆发,有几国能挡得住?中国院士的话,给大家吃了定心丸

一旦核战爆发,有几国能挡得住?中国院士的话,给大家吃了定心丸

离离言几许
2026-06-08 01:28:33
5年为豪门生下4胎,如今住杭州豪华别墅,一支专属团队贴身伺候

5年为豪门生下4胎,如今住杭州豪华别墅,一支专属团队贴身伺候

素衣读史
2026-06-06 21:57:52
2026-06-08 02:07:01
安全客 incentive-icons
安全客
有思想的安全新媒体
1360文章数 4754关注度
往期回顾 全部

科技要闻

黄仁勋访韩:首尔网吧会晤游戏巨头负责人

头条要闻

白人遭致命刺伤仍被带手铐终身亡 马斯克发声斯塔默怒斥

头条要闻

白人遭致命刺伤仍被带手铐终身亡 马斯克发声斯塔默怒斥

体育要闻

劳塔罗传射 梅西伤缺 阿根廷2-0洪都拉斯

娱乐要闻

戚薇坦言:陪睡只是低级潜规则

财经要闻

SpaceX上市前夕,忙着干三件大事

汽车要闻

奥迪全新超跑Nuvolari登场 千匹混动性能拉满

态度原创

旅游
家居
数码
手机
公开课

旅游要闻

关掉朋友圈之后发现自己不爱旅游!热情瞬间消失,原来我们都活在展示里

家居要闻

雅奢之序 五层别墅

数码要闻

AMD AIB合作伙伴预测:下代独立显卡至少要等一年

手机要闻

华为nova 16系列首销数据曝光,Pro版同比增长170%

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版