代码混淆与反混淆学习-第二弹

这篇具有很好参考价值的文章主要介绍了代码混淆与反混淆学习-第二弹。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

deflat 脚本学习【去除OLLVM混淆】

deflat脚本链接:GitHub - cq674350529/deflat: use angr to deobfuscation

deflat 脚本测试

这里以代码混淆与反混淆学习-第一弹中的OLLVM 混淆样本为例进行去除。【LLVM-4.0】

控制流平坦前 控制流平坦后
代码混淆与反混淆学习-第二弹 代码混淆与反混淆学习-第二弹

python deflat.py --file main-bcf --addr 0x401180

代码混淆与反混淆学习-第二弹

代码混淆与反混淆学习-第二弹

deflat.py 成功去除后效果:

代码混淆与反混淆学习-第二弹 代码混淆与反混淆学习-第二弹

去混淆后,效果还算可以,能分析程序流程了。

deflat 脚本分析【angr】

利用符号执行去除控制流平坦化 - 博客 - 腾讯安全应急响应中心 (tencent.com)

angr documentation

利用angr符号执行去除控制流平坦化 - 0x401RevTrain-Tools (bluesadi.github.io)

代码混淆与反混淆学习-第二弹

  • 序言:函数的第一个执行的基本块
  • 主(子)分发器:控制程序跳转到下一个待执行的基本块
  • retn块:函数出口
  • 真实块:混淆前的基本块,程序真正执行工作的版块
  • 预处理器:跳转到主分发器

如第一弹中分析:OLLVM 的控制流平坦化是将程序的一般逻辑划分为很多个真实执行的块,然后通过分发器进行链接。其实就是一个Switch结构,每次执行完真实块后,进行预处理,再跳转到主分发器,继续分发,最终达到平坦化的效果。

显然,去控制流平坦化就是要找到真实块间的跳转逻辑,打破Switch结构束缚。

具体来说,有如下步骤:

  1. 静态分析CFG得到序言/入口块、主分发器、子分发器/无用块、真实块、预分发器和返回块。
  2. 利用符号执行恢复真实块的前后关系,重建控制流
  3. 根据第二步重建的控制流Patch程序,输出恢复后的可执行文件

静态分析

首先明确:【以下结论针对OLLVM项目,其他大佬加料的OLLVM混淆还需要单独分析】

  1. 函数的开始地址为序言的地址
  2. 序言的后继为主分发器
  3. 后继为主分发器的块为预处理器
  4. 后继为预处理器的块为真实块
  5. 无后继的块为retn块
  6. 剩下的为无用块

angr 获取类似Ida的 CFG

代码混淆与反混淆学习-第二弹

获取真实块、主分发器、预处理器、序言、retn块和无用块

代码混淆与反混淆学习-第二弹

获取真实块的细节

代码混淆与反混淆学习-第二弹

angr 恢复真实块执行逻辑,重建控制流

利用angr 强大的符号执行功能,找到各真实块的连接逻辑。

代码混淆与反混淆学习-第二弹

这里对于两个分支的模拟执行,只需关注cmov指令,就可以分别对应得到eax、ecx,然后获得后续真实块。【局限性很大】

代码混淆与反混淆学习-第二弹

符号执行 symbolic_execution()函数,返回后继真实块。

代码混淆与反混淆学习-第二弹

Patch程序恢复执行逻辑

代码混淆与反混淆学习-第二弹

如此便完成了 deflat脚本的简单处理分析。

小结

分析下来,其实就是定位到所有真实块,然后利用angr符号执行将真实块间的执行逻辑进行串联。最后进行patch程序,重建控制流。

但显然存在一些问题,我们默认了如下规则:

  1. 函数的开始地址为序言的地址
  2. 序言的后继为主分发器
  3. 后继为主分发器的块为预处理器
  4. 后继为预处理器的块为真实块
  5. 无后继的块为retn块
  6. 剩下的为无用块

但是在实际去除控制流平坦化过程中,上面的默认思路已经被加混淆的开发者做了处理。

例如:

  • 后继为预处理器的块不一定是真实块;
  • 预处理器不一定存在;
  • 存在分支的真实块跳转的判断逻辑,不一定是cmov指令;
  • deflat脚本默认模拟执行最多两个分支,但真实情况可能不只两个分支;
  • 可能存在一个向前更新的数组,依据程序运行进行更新,决定当前真实块的跳转【这导致angr对于该块的模拟执行得不到正确的跳转】
  • 程序在加混淆前,已经被添加了花指令或其他处理,程序CFG图已经被打破;
  • 某个块存在死循环,会使angr符号执行卡死……

这也导致了,这个deflat脚本的普适性较低,除了能够处理OLLVM官方项目做的混淆,对加了其他PASS或者处理的混淆,基本用不了。

所以对于去除不了的OLLVM混淆,我们需要根据程序的实际混淆效果,对deflat脚本进行修改,再进行去混淆。

【这也要求对deflat 脚本比较熟悉,可以更快上手】

失败的花指令控制流平坦化尝试

使用代码混淆与反混淆学习-第一弹中加了花指令的程序,进行OLLVM控制流平坦化混淆,看看效果。

源代码如下:

代码混淆与反混淆学习-第二弹

# clang 执行内联汇编加 -fasm-blocks 或者 -fms-extensions 或者 -masm=intel

clang -mllvm -fla -mllvm -split -mllvm -split_num=3 main-call-加花.cpp -lm -fasm-blocks -o main-call-加花

# 需要对源代码作一些修改

存在较大的问题,我的OLLVM 环境是在Ubuntu上搭建的,对于上述内联汇编加的花指令无法编译通过!

【或许可以在Windows 上移植OLLVM,进行编译(好像挺难的)

代码混淆与反混淆学习-第二弹

可以看到,花指令用到的标签、$ 出现报错。

【最终也没解决编译问题,或许本就不可以,ollvm 不具备这样的处理能力,也可能是我代码的问题,如果博客前的你有任何想法,欢迎与我交流

TSCTF-J 2022-upx_revenge实战分析

TSCTF-J 2022 WP

upx_revenge题目进行分析。

代码混淆与反混淆学习-第二弹

首先直接使用deflat 脚本。

python deflat.py --file upx_revenge_test --addr 0x4016D0

代码混淆与反混淆学习-第二弹

发现没有找到retn 块。

处理多个retn块

回到ida 查看cfg 图发现原因:存在其他的退出块。

代码混淆与反混淆学习-第二弹

这里需要改进deflat 脚本,使其存在很多retn块。

# 其他位置的retn_node,对应改为list处理
if supergraph.out_degree(node) == 0:
            retn_node.append(node)

代码混淆与反混淆学习-第二弹

成功运行,但是去除效果不行。

去除后CFG图
代码混淆与反混淆学习-第二弹

多个comv的处理

很明显看出,程序的真实块间的逻辑串联失败,也就是重建控制流失败。

代码混淆与反混淆学习-第二弹

产生原因

代码混淆与反混淆学习-第二弹
代码混淆与反混淆学习-第二弹

显然,这里存在2个分支,因为有两个cmov【相同判断】,并且call 函数,对分支跳转是有作用的,这里var_CC是顺序执行,动态更新的。

【deflat 脚本只处理了执行有一个cmov指令的情况,且hook了call函数】

【由于var_CC是顺序执行,动态更新也可以看出,deflat 脚本的模拟执行思路已经无法对真实块的后继进行确定了】

但这里做个测试,不hook call 看是什么效果。

代码混淆与反混淆学习-第二弹

可以知道,取消hook call 对真实块后继的查找毫无影响,这是因为deflat中的模拟执行,只是基于comv 处的模拟。对前文并无任何关联。

显然,该deflat脚本的无法处理了。【】

总结

angr

upx_revenge 这道题而言,

deflat 脚本中angr 对局部的模拟执行显然无法获取真实块间的执行顺序,重建控制流显然也无从谈起。当然静态查找各个控制流平坦化的功能块效果还是可以的。

那么如何通过angr,有序的、联系上文地进行模拟执行,获取真实块的执行逻辑,显然是关键点!

【??? 后续学习了,有思路再更新】

unicorn

[原创]ARM64 OLLVM反混淆-Android安全-看雪论坛-安全社区|安全招聘|bbs.pediy.com (kanxue.com)

Unicorn反混淆:恢复被OLLVM保护的程序(一) - 简书 (jianshu.com)

使用unicorn 模拟执行框架获取真实块间的执行顺序,重建控制流。

【还没学过 unicorn 使用,,,】

ida

使用IDA microcode去除ollvm混淆(上) - 先知社区 (aliyun.com)

GitHub - PShocker/de-ollvm: IDA Python Script for anti ollvm

利用ida 现成的CFG 图,以及idc 脚本,动态运行程序,获取真实块的执行顺序,从而恢复控制流。文章来源地址https://www.toymoban.com/news/detail-408776.html

到了这里,关于代码混淆与反混淆学习-第二弹的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • PMP练习题 第二弹

    一个多阶段项目发起人离开公司,项目文件已获得批准并满足其目标。资源预算已到位。项目经理接下来应该怎么做? A:在离开组织的发起人的主管同意下,评估项目的持续需求 B:立即开始项目收尾过程 C:检查与商业论证的符合性 D:延迟重新评估,直至项目结束且资金

    2024年02月07日
    浏览(30)
  • Python 基础面试第二弹

    在Python中,面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它将数据和操作数据的方法组织在一起,形成对象。面向对象的编程主要围绕着类(Class) 和对象(Object)展开,通过封装、继承和多态等概念,实现代码的重用性、可维护性和可扩展性。 Python中的

    2024年02月11日
    浏览(34)
  • 力扣刷MySQL-第二弹(详细解析)

     🎉欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克🍹 ✨博客主页:小小恶斯法克的博客 🎈该系列文章专栏:力扣刷题讲解-MySQL 🍹文章作者技术和水平很有限,如果文中出现错误,希望大家能指正🙏 📜 感谢大家的关注! ❤️ 目录 🚀查找重

    2024年01月18日
    浏览(30)
  • C++第二弹---C++入门(中)

    ✨ 个人主页:   熬夜学编程的小林 💗 系列专栏:   【C语言详解】   【数据结构详解】 【C++详解】 C++入门 1、函数重载 1.1、函数重载概念 1.2、C++支持函数重载的原理--名字修饰(name Mangling) 3、引用 3.1、引用概念 3.2、引用特性 3.3、常引用 3.4、使用场景 3.5、传值、传引用

    2024年03月14日
    浏览(39)
  • 数据库基础面试第二弹

    乐观锁和悲观锁是在并发编程中使用的两种并发控制机制,用于解决多线程或多进程环境下的数据一致性问题。 1. 悲观锁 (Pessimistic Locking): 悲观锁的思想是假设并发访问会导致冲突,因此在访问共享资源之前,悲观锁会将资源锁定,确保其他线程无法修改资源。悲观锁的

    2024年02月10日
    浏览(26)
  • Kafka核心原理第二弹——更新中

    1. Kafka Producer怎么把消息发送给Broker集群的? 需要指定把消息发送到哪个topic去 首先需要选择一个topic的分区,默认是轮询来负载均衡,但是如果指定了一个分区key,那么根据这个key的hash值来分发到指定的分区,这样可以让相同的key分发到同一个分区里去,还可以自定义par

    2024年02月09日
    浏览(28)
  • 习题练习 C语言(暑期第二弹)

    重要的事说三遍! 学习!学习!学习! 对于代码段,下面描述正确的是( ) A: 其中循环控制表达式与0等价 B: 其中循环控制表达式与’0’等价 C:其中循环控制表达式是不合法的 D: 以上说法都不对 题目解析: 因print(“*”)函数调用的返回值是字符串中字符的个数,即为1。

    2024年02月10日
    浏览(26)
  • 计算机网络 基础面试第二弹

    TCP三次握手的过程如下: 第一步(SYN):客户端向服务器发送一个带有SYN(同步)标志的TCP包,指示客户端希望建立连接。这个包包含一个随机的初始序列号(ISN)。 第二步(SYN-ACK):服务器收到客户端的SYN包后,会发送一个带有SYN和ACK(确认)标志的TCP包作为回应。服务

    2024年02月08日
    浏览(39)
  • 数据结构——单链表OJ题(第二弹)

    此次练习题有两道! 有点小难度,但相信难不住大家的! 我也会给出两道OJ题的链接,大家也赶快去试一试吧 题目链接: OJ链接 提示: 链表中节点的数目范围在范围 [0, 104] 内 -105 = Node.val = 105 pos 的值为 -1 或者链表中的一个有效索引 本题有两个解析思路~ 代码演示: 提示:

    2024年02月14日
    浏览(27)
  • 大数据分析平台释疑专用帖第二弹

    不管是想要快速了解BI大数据分析平台,还是想要了解BI和自己的需求匹配度,都可关注我们的释疑专用贴。 1、可以分析直播数据吗? 严格来说,只要能够提供数据,就可以做数据可视化分析,直播数据也同理。 如果用户无法将直播数据导出,则可以选择通过API接口,或者

    2024年02月09日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包