最终,基于LLVM的编译器会在前端生成LLVM IR后调用一些LLVM Pass做机器无关优化, 然后再调用LLVM后端生成目标平台代码。 静态分析: 像VSCode的C/C++插件就会用LLVM Pass来分析代码,提示可能的错误 (无用的变量、无法到达的代码等等)。 …… (自行发挥想象) 再次强调,LLVM的核心是一个库,而不是一个具体的二进制程...
LLVM uses the new pass manager for the optimization pipeline (the codegen pipeline still uses the legacy pass manager) 所以这里只讨论legacy pass manager When choosing a superclass for yourPass, you should choose themost specificclass possible, while still being able to meet the requirements listed...
LLVM IR有两种文件格式.ll和.bc,.ll 文件和 .bc 文件都是 LLVM 中间表示的不同表示形式,.ll 文件是文本形式的可读表示,方便分析和调试;.bc 文件是二进制形式的紧凑表示,用于编译过程中的处理和优化,所以主要看.ll格式文件内容。 再介绍一些IR相关的概...
后端的所有要做的事情其实就是一个个的Pass,由 PassManager 进行管理,可能是各种类型的Pass,ModulePass是通过 llvm/lib/IR/LegacyPassManager.cpp:1545LocalChanged |= MP->runOnModule(M);来运行的,runOnModule 就是这个 Pass 的入口;FunctionPass是通过 llvm/lib/IR/LegacyPassManager.cpp:1430LocalChanged |=...
llvm::legacy::PassManager::~PassManager()在llvm::legacy::PassManager对象的生命周期结束时被自动调用,用于执行清理和释放资源的操作。在对象的销毁过程中,会自动释放该 Pass 管理器对象所拥有的所有 Pass 对象,确保资源正确释放。 调试过程 add(1, 0x77E100); ...
而LLVM-PASS类的pwn题,就是利用这一过程中可能出现的漏洞。 LLVM PASS类题目都会给出一个xxx.so,即自定义的LLVM PASS模块,漏洞点就自然会出现在其中。 我们可以使用opt -load ./xxx.so -xxx ./exp.{ll/bc}命令加载模块并启动LLVM的优化分析(其中-xxx是xxx.so中注册的PASS的名称,README文档中一般会给出,...
在LegacyPass中通过类型严格区分了module pass,function pass等。通过这张图可以看到Pass的继承链。(这里图片太长我只截取部分 来源:https://llvm.org/doxygen/classllvm_1_1Pass.html LegacyPass中就是非常普通的继承链,从这个角度上来说没什么可讲的
在clang中,PassPlugin.cpp中的PassPlugin::Load函数会遍历 “-Xclang -fpass-plugin” 传入的pass模块,我们必须要导出我们pass插件模块llvmGetPassPluginInfo函数以便clang去调用从而加载插件中的pass。但是我们不可以使用__declspec(dllexport)导出函数,会报链接类型错误。
首先,需要在头文件中定义Pass,创建llvm/include/llvm/Transforms/Utils/HelloWorld.h文件。该文件应包含以下模版文件: #ifndef LLVM_TRANSFORMS_HELLONEW_HELLOWORLD_H#define LLVM_TRANSFORMS_HELLONEW_HELLOWORLD_H#include "llvm/IR/PassManager.h"name...
Ciscn2021和2022都有一道名为Satool的题目,它是LLVM-PASS类Pwn题。 由于高版本glibc的IO题比较模板化,近两年ciscn半决赛对LLVM-PASS等逆向难度较高的题目也都有所涉及。 本科期间在《编译原理》这门课学习过LLVM的一些基础知识,这里系统的总结下LLVM-PASS在二进制安全中的应用。简介...