惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

SecWiki News
SecWiki News
I
InfoQ
The Cloudflare Blog
人人都是产品经理
人人都是产品经理
博客园 - Franky
T
Tailwind CSS Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
量子位
博客园_首页
罗磊的独立博客
V
V2EX
李成银的技术随笔
大猫的无限游戏
大猫的无限游戏
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
True Tiger Recordings
Vercel News
Vercel News
Cyberwarzone
Cyberwarzone
Cisco Talos Blog
Cisco Talos Blog
F
Fox-IT International blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
M
Microsoft Research Blog - Microsoft Research
Know Your Adversary
Know Your Adversary
爱范儿
爱范儿
The Register - Security
The Register - Security
G
Google Developers Blog
The Hacker News
The Hacker News
Malwarebytes
Malwarebytes
S
Securelist
博客园 - 三生石上(FineUI控件)
Jina AI
Jina AI
T
Threat Research - Cisco Blogs
T
The Exploit Database - CXSecurity.com
S
SegmentFault 最新的问题
博客园 - 叶小钗
F
Fortinet All Blogs
Apple Machine Learning Research
Apple Machine Learning Research
宝玉的分享
宝玉的分享
博客园 - 聂微东
T
Threatpost
博客园 - 【当耐特】
D
Docker
P
Privacy & Cybersecurity Law Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
G
GRAHAM CLULEY
V
Visual Studio Blog
C
Cisco Blogs
IT之家
IT之家
S
Security Archives - TechRepublic
Latest news
Latest news
阮一峰的网络日志
阮一峰的网络日志

Mox的笔记库

细嗦下MLIR的环境搭建 | Mox的笔记库 博客重构:从Hexo到Astro | Mox的笔记库 2026PPoPP MLIR Tutorial学习 | Mox的笔记库 MacOS配置《明日方舟:终末地》 | Mox的笔记库 2025:向内生长 | Mox的笔记库 由mlir::ExecutionEngine引发的跨系统问题 | Mox的笔记库 WSL2配置Cuda-Tile环境记录(未完待续) | Mox的笔记库 Vibe Coding手搓项目记录 | Mox的笔记库 给Debian上包——以DuckDB为例 | Mox的笔记库 UCPD.sys事件存档 | Mox的笔记库 换新电脑之Mac mini M4从购买到配置 | Mox的笔记库 Mac配置MLX-C开发环境 | Mox的笔记库 RISC-V meets RDBMS——RISC-V架构上可运行数据库一览 | Mox的笔记库 DuckDB Sort实现调查 | Mox的笔记库 修复Redis在树莓派5上无法运行的问题 | Mox的笔记库 如何在MLIR中自定义类型并且输出运行 | Mox的笔记库 网站网络结构变更记录 | Mox的笔记库 EDBT25论文阅读:PhoebeDB——A Disk-Based RDBMS Kernel for High-Performance and Cost-Effective OLTP SIGMOD25论文阅读:BPF-DB:——A Kernel-Embedded Transactional Database Management System For eBPF Applications SIGMOD24文章阅读:Query Compilation Without Regrets | Mox的笔记库 论文阅读:Designing an Open Framework for Query Optimization and Compilation Apache Arrow Gandiva项目解析 | Mox的笔记库 VLDB24论文阅读:Cloud-Native Database Systems and Unikernels——Reimagining OS Abstractions for Modern Hardware NoisePage源码分析(未完待续) | Mox的笔记库 VLDB20论文阅读:Mainlining Databases——Supporting Fast Transactional Workloads on Universal Columnar Data File Formats VLDB17论文阅读:Relaxed Operator Fusion for In-Memory Databases:Making Compilation, Vectorization, and Prefetching Work Together At Last 论文阅读:How not to structure your database-backed web applications——a study of performance bugs in the wild SIGMOD24阅读:ROME——Robust Query Optimization via Parallel Multi-Plan Execution 文章阅读:First Past the Post-Evaluating Query Optimization in MongoDB SIGMOD文章阅读:Apache Calcite——A Foundational Framework for Optimized Query Processing Over Heterogeneous Data Sources VLDB23论文阅读:Analyzing the Impact of Cardinality Estimation on Execution Plans in Microsoft SQL Server SIGMOD22论文阅读:Efficient Massively Parallel Join Optimization for Large Queries VLDB论文阅读:Weaving Relations for Cache Performance VLDB22论文阅读:ConnectorX——Accelerating Data Loading From Databases to Dataframes 论文阅读:UniKraft-Fast, Specialized Unikernels the Easy Way 当DuckDB遇上RISC-V | Mox的笔记库 SIGMOD25论文阅读:An Elephant Under The Microscope——Analyzing The Interaction Of Optimizer Components In PostgreSQL 论文阅读:Compile-Time Analysis of Compiler Frameworks for Query Compilation VLDB23阅读:Bringing Compiling Databases to RISC Architectures LingoDB源码编译与分析 | Mox的笔记库 淦!MLIR输出Hello World不应该这么难! | Mox的笔记库 如何愉快的运行一个MLIR程序 | Mox的笔记库 2024:拥挤年代的想象与创造 | Mox的笔记库 如何给自己的博客添加MLIR和LLVM IR语法高亮 | Mox的笔记库 VLDB19-Parsing Gigabytes of JSON per Second论文阅读 CIDR25:Runtime-Extensible Parsers阅读 | Mox的笔记库 MLIR学习资料整理 | Mox的笔记库 SIGMOD24文章阅读:VeriTxn | Mox的笔记库 VLDB23文章阅读——Exploiting Cloud Object Storage for High-Performance Analytics VLDB24——OLAP on Modern Chiplet-Based Processors走马观花阅读 VLDB22:YeSQL文章阅读(已废弃) | Mox的笔记库 如何让数据库中的Python跑的更快-VLDB22-YeSQL文章阅读 | Mox的笔记库 你好,世界! | Mox的笔记库 让系统研究更有意义:HarmonyOS NEXT的教训和经验——讲座回顾 | Mox的笔记库 UNSW 24T3 COMP9336上课记录 | Mox的笔记库 Velox开发环境配置踩坑记录 | Mox的笔记库 MLIR Toy Tutorial实践记录 | Mox的笔记库 论文阅读:Declarative Sub-Operators for Universal Data Processing LLVM-Kaleidoscope实操踩坑记录 | Mox的笔记库 2024年7月RSSHub开发体验 | Mox的笔记库 澳洲大学计算机硕士比较 | Mox的笔记库 论文阅读——CDUL:CLIP-Driven Unsupervised Learning for Multi-Label Image Classification 论批量快速添加图片与视频水印的事 | Mox的笔记库 CVPR2023-CLIP算法调研 | Mox的笔记库 基于元信息写入的服务器压力测试 | Mox的笔记库 MjAyMw==,希望,前进与平庸之道 | Mox的笔记库 家庭组网IPv6+Mesh折腾 | Mox的笔记库 code-server初体验 | Mox的笔记库 从Nginx到Caddy | Mox的笔记库 Hexo部署安装全流程回顾 | Mox的笔记库 RMM观察与初探 | Mox的笔记库 计算机网络课设——UDP/TCP/TLS Socket实验 | Mox的笔记库 JQuery的XSS初探 | Mox的笔记库 生产实习记录 | Mox的笔记库 Fedora-CoreOS配置与试用(2023年) | Mox的笔记库 Electron学习笔记 | Mox的笔记库 ServerSentEvent学习 | Mox的笔记库 报告翻译:容器云的安全挑战 | Mox的笔记库 Arch Linux迁移计划 | Mox的笔记库 Vagrant配置Metarget靶场环境 | Mox的笔记库 OpenAI-whisper折腾 | Mox的笔记库 202202,困惑,混乱与未曾设想之路 | Mox的笔记库 2022年Hack the box:Tier1免费区全解 | Mox的笔记库 Navidrome部署记录 | Mox的笔记库 长安杯2021-snake复现 | Mox的笔记库 从零开始的Django CVE-2022-28346复现 | Mox的笔记库 2022CISCN(西北区赛)-The shinning | Mox的笔记库 Docker+QEMU+Arm64(Ubuntu)+环境配置(2022版) | Mox的笔记库 Arch Linux运行树莓派系统(2022年) | Mox的笔记库 2022CISCN初赛-ez_usb-复盘WriteUp | Mox的笔记库 NodeMCU-MicroPython配置实录 | Mox的笔记库 Django事务使用 | Mox的笔记库 记录第一次EduSRC上报 | Mox的笔记库 Jetbrain问题应急处理 | Mox的笔记库 Celery5.2学习&配置 | Mox的笔记库 Waline部署记录 | Mox的笔记库 2021年12月 Vivo千镜杯回顾 | Mox的笔记库 Frida hook初次实战 | Mox的笔记库 Log4j2漏洞复现 | Mox的笔记库 Windows的WSL2+Docker初探 | Mox的笔记库
报告概要翻译:OBFUSCATING C++ PROGRAMS VIA CONTROL FLOW FLATTENING
2022-08-16 · via Mox的笔记库

中文译名:通过扁平控制流的混淆的C ++程序

这篇文章写于2009年,作者是T. L ́aszl ́o 和 ́ A. Kiss,是一切Ollvm技术的初始,在不少博客和文章中均有提及。将顺序的流程变为利用switch-case这种分支判断的扁平运行,给软件逆向增加难度。目前看到最多的使用环境是加密Android的C++ NDK程序库。

OLLVM(Obfuscator-LLVM)是瑞士西北应用科技大学安全实验室于2010年6月份发起的一个项目,该项目旨在提供一套开源的针对LLVM的代码混淆工具,以增加逆向工程的难度。

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

看雪社区-控制流平坦化的实现

title

摘要

利用混淆技术保护 C++ 源代码,并在文章中给出一个能把程序复杂度提高5倍,且并不影响原有功能的技术原型方案。

实现平坦化的方法:将代码分成多个基本块(就是case代码块)和一个入口块,为每个基本块编号,并让这些基本块都有共同的前驱模块和后继模块。前驱模块主要是进行基本块的分发,分发通过改变switch变量来实现。后继模块也可用于更新switch变量的值,并跳转到switch开始处。

引用一下腾讯安全的图

Ollvm运行图

正文

混淆技术的要点在于:修改程序,使其逆向结果阅读困难,却不影响正常程序运行

最简单的混淆方式是布局转换(layout transformation),去除符号表,注释与调试信息

另外一种方式是数据混淆:修改数据结构,修改变量的可见性重构数组

第三类是修改控制流转换算法,也就是本文的Ollvm

要实现这个目的,第一步需要把程序主体分解成块状,在每个块状后面设置条件转向(使用Switch语句)

效果图

而对于break,需要强行增加switch以提高拆分粒度。

while的解决方案

C++的try-catch异常处理机制也是难题,异常条件在不确定时间点的抛出也会影响程序的运行顺序。文章给的解决方案是用try-switch加goto的方案解决。把try包到最大的switch里头,没有异常就直接回到起始点,出现异常就跳出switch。

image.png

在C++语言上实现的难题

“breaking loops to basic blocks is not equal to simply splitting the head of the loop from its body”

像while, do 和 for这些循环操作,可能会发生错误,写在初始点的判断条件也要做出修改,而原本的switch分支也很难处理。就算这些语句不做额外处理,里面的break与continue也会造成麻烦。

对于switch分支,Duff给出的解决方案

Duff advice

运行流控制算法

用伪代码描述流程,查看规则如下

bold words mark the keywords of the used pseudo-language,

the formalized parts are typeset in roman font,

while the parts which are easier to explain in free text are in italic.

⊕ denotes string concatenation, while ⇒ outputs the result of the algorithm

直接上三张图,看看大佬的工作:对于不同的流程(for,switch,if,do)给出的拆分方案,一切都安排得明明白白

文章默认预设变量与函数主体分离,并在开始处完成初始化(这其实也是个大问题,受限于文章篇幅不多加讨论)

image.png

文章举例第六图的transform_if,分支递归调用transform_block的内容。对于非结构性的流程,使用堆栈解决。

image.png

同样的,对于try语句,通过递归调用flatten_block来取代transform_block

image.png

老实说,这部分看的很迷糊,讲述了混淆具体流程的伪代码,但离工程实践还有些距离

实验结果

使用Columbus framework的CAN C++ analyzer进行分析,并进行基准测试

使用McCabe Cyclomatic Complexity Metric 测量软件复杂度,检验扁平控制流的混淆效果,实验结果表示函数复杂度有3到5倍的提升

image.png

实验还对使用扁平控制流程序的资源消耗进行了统计。通过计算抽象语法树(AST)的节点树计算函数复杂度,使用X86架构GCC计算编译时间,测试环境是带有3Ghz CPU的Linux系统。从平均结果来看,函数大小和运行时间相比较于未处理前都翻了一倍。

如果只对特定函数(一些关键函数)做扁平化处理,时间和大小会更少更短,更符合实际需求。

image.png

相关研究

Collberg, Thomborson , Low 等人讲述了混淆的重要性,并总结了有关Java的混淆技术,并在后期文章里讲述了通过对java控制流插入花指令进行混淆,这种方法不会显著影响代码体积与运行时间

Sarmenta的报告研究了参数混淆,报告说明了如何使加密的函数被混淆,或者混淆的函数得到加密

Wroblewski在其博士论文中从汇编层面讨论了Low的代码混淆方法,并给出了新的混淆方法

文章提到了一个名为COBF的工具,但其指向的链接已失效。该工具实现了C++程序的重命名。

未来展望

文章中提到的扁平流控制算法,可以适用于多种编程语言,能有效提高函数复杂度。

改变扁平流程块的顺序可有效提高函数混淆效果,使用goto也能增加理解难度。

工具

用于解决Ollvm混淆用到的工具

Triton

angr

CTF题目

buu-[RoarCTF2019]polyre