- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
deflat脚本链接: GitHub - cq674350529/deflat: use angr to deobfuscation 。
这里以 代码混淆与反混淆学习-第一弹 中的OLLVM 混淆样本为例进行去除。【LLVM-4.0】 。
控制流平坦前 | 控制流平坦后 |
---|---|
python deflat.py --file main-bcf --addr 0x401180 。
deflat.py 成功去除后效果:
去混淆后,效果还算可以,能分析程序流程了.
利用符号执行去除控制流平坦化 - 博客 - 腾讯安全应急响应中心 (tencent.com) 。
angr documentation 。
利用angr符号执行去除控制流平坦化 - 0x401RevTrain-Tools (bluesadi.github.io) 。
如第一弹中分析:OLLVM 的控制流平坦化是将程序的一般逻辑划分为很多个真实执行的块,然后通过分发器进行链接。其实就是一个Switch结构,每次执行完真实块后,进行预处理,再跳转到主分发器,继续分发,最终达到平坦化的效果.
显然, 去控制流平坦化 就是要找到真实块间的跳转逻辑,打破Switch结构束缚.
具体来说,有如下步骤:
首先明确: 【以下结论针对OLLVM项目,其他大佬加料的OLLVM混淆还需要单独分析】 。
angr 获取类似Ida的 CFG 。
获取真实块、主分发器、预处理器、序言、retn块和无用块 。
获取真实块的细节 。
利用angr 强大的符号执行功能,找到各真实块的连接逻辑.
这里对于两个分支的模拟执行,只需关注 cmov 指令,就可以分别对应得到eax、ecx,然后获得后续真实块。【局限性很大】 。
符号执行 symbolic_execution() 函数,返回后继真实块.
如此便完成了 deflat脚本的简单处理分析.
分析下来,其实就是定位到所有真实块,然后 利用angr符号执行将真实块间的执行逻辑进行串联 。最后进行patch程序,重建控制流.
但显然存在一些问题,我们默认了如下规则
但是在实际去除控制流平坦化过程中,上面的默认思路已经被加混淆的开发者做了处理.
例如:
cmov
指令; 程序CFG图
已经被打破; 这也导致了,这个 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 WP 。
对 upx_revenge 题目进行分析.
首先直接使用deflat 脚本.
python deflat.py --file upx_revenge_test --addr 0x4016D0 。
发现没有找到retn 块.
回到ida 查看cfg 图发现原因:存在其他的退出块.
这里需要改进deflat 脚本,使其存在很多retn块.
# 其他位置的retn_node,对应改为list处理
if supergraph.out_degree(node) == 0:
retn_node.append(node)
成功运行,但是去除效果不行.
去除后CFG图 |
---|
很明显看出,程序的真实块间的逻辑串联失败,也就是重建控制流失败.
产生原因 。
显然,这里存在2个分支,因为有两个 cmov 【相同判断】,并且call 函数,对分支跳转是有作用的,这里var_CC是顺序执行,动态更新的.
【deflat 脚本只处理了执行有一个 cmov 指令的情况,且hook了call函数】 。
【由于var_CC是顺序执行,动态更新也可以看出,deflat 脚本的模拟执行思路已经无法对真实块的后继进行确定了】 。
但这里做个测试,不hook call 看是什么效果.
可以知道,取消hook call 对真实块后继的查找毫无影响,这是因为deflat中的模拟执行,只是基于 comv 处的模拟。对前文并无任何关联.
显然,该deflat脚本的无法处理了。【】 。
就 upx_revenge 这道题而言, 。
deflat 脚本中angr 对局部的模拟执行显然无法获取真实块间的执行顺序,重建控制流显然也无从谈起。当然静态查找各个控制流平坦化的功能块效果还是可以的.
那么如何通过angr,有序的、联系上文地进行模拟执行,获取真实块的执行逻辑,显然是关键点! 。
【??? 后续学习了,有思路再更新】 。
[ 原创]ARM64 OLLVM反混淆-Android安全-看雪论坛-安全社区|安全招聘|bbs.pediy.com (kanxue.com) 。
Unicorn反混淆:恢复被OLLVM保护的程序(一) - 简书 (jianshu.com) 。
使用unicorn 模拟执行框架获取真实块间的执行顺序,重建控制流.
【还没学过 unicorn 使用,,,】 。
使用IDA microcode去除ollvm混淆(上) - 先知社区 (aliyun.com) 。
GitHub - PShocker/de-ollvm: IDA Python Script for anti ollvm 。
利用ida 现成的CFG 图,以及idc 脚本,动态运行程序,获取真实块的执行顺序,从而恢复控制流.
最后此篇关于代码混淆与反混淆学习-第二弹的文章就讲到这里了,如果你想了解更多关于代码混淆与反混淆学习-第二弹的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我真的很困惑。我已经尝试使用带有 tomcat 的 Jax-rs 并使用所有注释,我能够使用 url 调用我的服务。因此,如果没有 Jax-rs,我可以简单地拥有一个 servlet 并调用我的服务。
是否有任何工具/商业混淆器可以混淆 WPF 控件中的 BAML 资源? 如果没有,就 IP 保护而言,这是一段艰难的时期,因为黑客可以通过使用 BAML 到 XAML 转换器轻松查看 BAML 资源。
嘿大家。我在尝试使用 COBOL 在 zOS 环境中解决的编码项目中遇到了一些麻烦。我需要读入一个文件并将它们放入索引表中(我知道将少于 90 条记录)。 让我感到困扰的是,我们受到项目参数的约束,以
我试图按照这个例子来理解 join() 方法: class PrintDemo { public void printCount() { try { for(int
当我编译我正在编写的代码,然后在 JD Gui 中查看时,方法显示带有如下标题: public void growSurface(Random paramRandom, int paramInt1,
我正在为重新分发准备 Android 库,它的代码必须进行混淆处理。我已经阅读了有关此主题的一些内容,并且决定使用 Android Library Project。它将作为 jar 分发(自动在/bi
两个混淆相关的问题: 1) 是否有任何工具可以将 F# 从 MSIL 目标形式反汇编回其源形式或接近它的形式?这不是通过默默无闻来实现安全性的尝试,但我想保护某些源代码免遭“盗窃”。 2) 我简要地查
谁能向我解释为什么 simulatedCase <- rbinom(100,1,0.5) simDf <- data.frame(CASE = simulatedCase) posterior_m0
我一直无法找到关于使用 AppDomains 时发生的事情的非常清楚的描述,所以希望有人能够启发我。我有一个简单的测试程序(基本上是扯掉了 MSDN example ): using System;
假设我有 2 个分支topic和 master如果我在 topic分支,然后运行 git rebase master它是 rebase master 还是 rebase 主题分支? 做 git r
我有一个类(class): public class LockTest { public void LockThis() { lock (this)
我正在尝试最小化/混淆我的 Angular 代码,但遇到了问题。我在这里阅读“缩小说明”http://docs.angularjs.org/tutorial/step_05但我定义我的 Control
我遇到了一些困惑的操作。 var a = 0.1; var b = 0.2; var c = 0.3; console.log(a); // 0.1 console.log(b); // 0.2 co
感谢您查看我的帖子 - 我正在尝试弄清楚如何在单击链接时关闭此下拉菜单,但我的 JavaScript 技能非常缺乏,而且代码似乎很困惑。这是 HTML:
混淆、哈希和加密之间有什么区别? 这是我的理解: 哈希是一种单向算法;无法逆转 混淆与加密类似,但不需要任何“ secret ”即可理解(ROT13 就是一个例子) 加密是可逆的,但需要“ secre
我有以下代码 my $content = $response->content; $content =~ /username=([\s\S]+?)&/; my $username = $1; prin
我在 .NET 中发现了一些与我预期的有点不同的东西。我粘贴的代码没有意义,但它是我拥有的一个复杂得多的函数的浓缩版。我实际上是在获取匿名类型信息作为参数(尚未创建匿名类型的实例),我需要创建该类型的
我正在努力解决 JavaFX 应用程序的混淆问题。使用此项目作为基础: https://github.com/openjfx/samples/tree/master/IDE/IntelliJ/Non-
是否可以制作一个与此类似的 CSV 阅读器 while((line = reader.readLine()) != null){ String[] values = line.
公共(public)类测试2 { 公共(public)静态无效主(字符串[]参数){ System.out.println("3 + 6"); System.out.println(3
我是一名优秀的程序员,十分优秀!