控制流平坦化初了解(持续更新)

news/2024/12/30 18:04:27/文章来源:https://www.cnblogs.com/T0fV404/p/18638635

控制流平坦化初了解

原理

借助LLVM(一个底层虚拟机项目,我目前不理解虚拟机这个概念)这个项目,目前理解为类似于一个编译器的东西,把源码通过各式各样的复杂的语义分析翻译成另一个玩意.

但原本是拿来优化的,然后做安全的人拿来改为混淆,就是OLLVM项目,做安全不得好死😡.

控制流平坦化(control flow flattening)的基本思想主要是通过一个主分发器来控制程序基本块的执行流程,例如下图是正常的执行流程img

添加控制流平坦化

build/bin/clang check_passwd.c -o check_passwd_flat -mllvm -fla

经过控制流平坦化后的执行流程就如下图img

这样可以模糊基本块之间的前后关系,增加程序分析的难度,同时这个流程也很像VM的执行流程

平坦化程序特征

img

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

解决方法

两种:

  • D810脚本
  • deflat

D810

D-810是一个基于IDA Microcode实现的可拓展的ida去混淆插件,尤其是在CTF中碰到控制流平坦化时可以使用默认的脚本F5一键去平坦化。

1)安装

GitHub - zhkl0228/d810: D-810 is an IDA Pro plugin which can be used to deobfuscate code at decompilation time by modifying IDA Pro microcode.

把文件夹和.py复制到IDA目录的plugin下即可

(另外建议安装Z3以便能够使用 D-810 的几个功能

pip install z3-solver 

2)使用

启动IDA

在Edit->plugins-D-810 或 快捷键CTRL+shift+D 启动D810

在Current file loaded中可以选择要载入的去混淆规则,如去平坦化

img

1:选中你需要的反混淆规则,我是反ollvm所以选ollvm的

2:start 点击后右边会变成绿色loaded

3:回到需要反混淆的函数,F5大法好

(此处Decompiling需要等一会

同理,点击stop关闭去混淆

(如果安装完出现这种问题img

参考

ida插件-d810安装和使用 - 0P1N

https://github.com/igogo-x86/HexRaysPyTools/issues/48

重新安装sip.pyd即可

deflat

法二:使用基于angr的脚本deflat.py去除控制流平坦化

安装

  1. 首先安装angr库

Windows + R 输入cmd

pip install angr
  1. 脚本github地址deflat: use angr to deobfuscation

把am_graph.py 与deflat.py放在同一目录下

所在目录下打开cmd命令行输入

 python + deflat.py + 文件名 + 起始地址(基本就是main函数的地址)#python deflat.py hardCpp 0x4007E0  

关键之处在于寻找程序的 address

注意到“函数的开始地址为序言的地址”,因此我们需要在序言中找函数起始位置img

期间可能会出现大量类似警告:img

没事,只要最后是这样就好:img

img得到一个已成功去平坦化的recovered新文件,用这个文件继续分析

参考

反混淆器:D810的安装和使用 #ollvm去平坦化 #D-810 - 『逆向资源区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

[OLLVM 与去平坦化 & RoarCTF2019] polyre 详细WP - 『脱壳破解区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

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


参考:

【RE】去OLLVM的平坦化_d810插件-CSDN博客 基本来自这篇文章


一些可以继续学习的思路:

  • 了解如何魔改平坦化
  • 魔改deflat为全部识别(Errmis学长的想法,不过大概率不可行,而且工作量巨大)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/860820.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DevEco Studio使用模拟器报错,解决办法

在进行鸿蒙应用开发时,很多开发者没有鸿蒙系统的设备,无法在鸿蒙系统真机上进行调试,这时就需要使用官方提供的模拟器。在菜单栏Tools---Device Manager,打开模拟器弹窗,登录华为账号后即可进行模拟器管理。但在模拟器下载后,点击右侧Actions启动时,会遇到提示报错“模拟…

为什么要做纯血鸿蒙操作系统?

在10月22日,华为最新的原生鸿蒙之夜暨全场景新品发布会上,余承东正式发布了“纯血鸿蒙”操作系统,这是继苹果iOS和安卓系统之后的全球第三大移动操作系统,同时也标志着国产操作系统实现了全面突破。(央视新闻报道https://mp.weixin.qq.com/s/IFatTQ7u7h92iGrr-xEedw)。那…

GIMP 处理 png 透明边缘

首先设置画布大小然后点击 图层 -> 图层到图像大小

时间的本质-计算视角

原作:Stephen Wolfram计算机视域下的时间 时间是人类经验的核心。然而,究竟什么是时间?在传统科学中,它常被比作空间坐标(尽管这种坐标对我们来说总是不断增长)。尽管这种描述在数学上可能很有用,但它并没有揭示时间的本质。 一旦我们开始用计算术语思考,就会觉得越来越…

中考英语优秀范文-002 Music 音乐

1 写作要求 作家雨果说过:“开启人类智慧的钥匙有三把,一是字母,二是数字,三是音符。”从这句话中,我们足可见音乐对人的发展的影响。请你根据以下提示,以Music为题,写一篇短文参加学校的英语作文竞赛。 提示: 1音乐使人充满活力,让人快乐; 2 没有音乐,生活就没有乐…

Windows11安装Linux子系统(WSL2)

1、确认BIOS中已经打开虚拟化 Virtualization Technology (我的机器默认已经打开 Enabled / Disabled,主板不同进入的地方不一样,自行搜索) 2、以管理员身份打开 PowerShell 3、输入(此步安装WSL): dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subs…

软工个人总结

结束了? 一、学期回顾 1.1 课程想象与现实 最初听闻软件工程课程,脑海中浮现的是一群程序员在电脑前敲打着代码,创造出一个个功能强大的软件。想象着自己能通过这门课,精通多种编程语言,独立开发出令人惊艳的应用程序。可是在第一次编程作业布置下来时,发现自己什么也不会…

UML之关联

关联指两个类之间的各种联系。UML使用各种单实线表示关联,但关联所能够表达的信息远不只是一条实线所传递的依赖。关联指两个类之间的各种联系。UML使用各种单实线表示关联,这个单实线可以是直线(垂直的、水平的或者倾斜的)、折线甚至曲线。 事实上,关联也是展示类的属性的…

代码随想录——动态规划13.分割等和子集

思路 难点 我只想到了:“找一个子集,每个数取或不取求其和,看是否和另一个子集的和相等 ” 但是实际上既然是两个子集相等,那么只要和等于 sum/2 即可了! 取或不取用01背包,但是不知道怎么用。 只有确定了如下四点,才能把01背包问题套到本题上来。背包的体积为sum / 2 背…

深度解析 Transformer 模型中的位置嵌入(Positional Embedding)

在自然语言处理中,词语的顺序对句子的意义至关重要。然而,传统的自注意力机制无法区分词语的位置。本文深入浅出地介绍了**位置嵌入(Positional Embedding)**的概念及其在Transformer模型中的作用,解释了它如何帮助模型理解词语的顺序,从而提升文本处理的准确性。通过简单…

java8--方法--格式化输出--printf--索引

System.out.printf("%1$s %2$tB %2$te %2$tY","Due date",new Date()); 效果图:ps: 1.一个字符串需要有多个格式化单词,通过建立索引实现,索引值用%$包围,$后紧跟格式化的目标类型,后面按顺序传入变量或填写内容 2.t指定日期类型,b指定填充月份的完…

前端重学之Number

Number (尾附IEEE754解读) mdn文档 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Numberjs里的number是双进度浮点数 用IEEE745 编码 0b 0o 0x 分别表示 二进制 八进制 十六进制```js 0.tostring() //报错 0 .tostring()//正确 ```IEEE7…