LLVM 入门教程之 Pass 编写

前言 本篇文章作为 Pass 编写的入门,主要介绍以下内容: 示例 Pass 编写 Pass 编译构建和运行 Pass 不同子类 Pass 注册 Pass 间依赖 示例 首先我们先结合一个小示例,尝试编写 Pass,之后再详细介绍涉及的内容。 #include "llvm/Pass.h" //添加头文件#include "llvm/IR/Function.h"#include "llvm/Support/raw_ostream.h"#include "llvm/IR/LegacyPassManager.h"#include "llvm/Transforms/IPO/PassManagerBuilder.h"using namespace llvm; //添加 llvm 命名空间 namespace { // 定义匿名命名空间 struct SkeletonPass : public FunctionPass { // 定义 SkeletonPass 继承 FunctionPass static char ID; // // ID 标识 SkeletonPass() : FunctionPass(ID) {} virtual bool runOnFunction(Function &F) { //// 重载 runOnFunction 函数,接受Function类型参数 errs() << "I saw a function called " << F....

LLVM 入门教程之基本介绍

前言 本篇文章作为LLVM入门教程,包括以下内容: LLVM 的安装 LLVM 源码结构 LLVM 工具介绍 Clang 基本使用 LLVM IR 基本内容 Pass 介绍 安装 目前 LLVM 的最新版本为 10.0.0,我尝试通过预编译和源码编译两种安装方式安装了 LLVM+Clang。下面介绍这两种方式。 预编译源码安装 直接去官网下载解压即可,或者去镜像网站 下载,根据系统选择压缩包进行下载,此处我选择的是 clang+llvm-10.0.0-x86_64-linux-gnu-ubuntu-18.04.tar.xz 。 源码编译安装 首先下载相关源码,可以从 github llvm-project 选择自己需要的源码下载,也可以从上面的镜像网站下载。这里我从镜像网站下载了llvm 和 clang 源码( clang-10.0.0.src.tar.xz 、llvm-10.0.0.src.tar.xz ) 然后将源码进行解压,保持其目录与 llvm-project 目录一致,即 目录结构图: llvm-project - llvm - clang - build 然后进入llvm-project 目录编译,如果没有 cmake 可以直接通过 apt 安装一下。 $ cd llvm-project $ mkdir build && cd build $ cmake -G "Unix Makefiles" -DLLVM_ENABLE_PROJECTS="clang" \ -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD="X86" \ -DBUILD_SHARED_LIBS=On ....

zeratool:基于 angr 的CTF pwn 自动化利用工具介绍

文章首发于 先知社区 前言 Zeratool 实现了针对 CTF 中的 pwn 题的自动化利用生成(Automatic Exploit Generation)以及远程获取 flag。 它基于 angr, 探索程序未约束的状态,继而分析状态的寄存器信息和内存布局,设定约束,对约束进行求解,结合 pwntools 编写脚本,提交 payload 到远程 CTF 服务器获得 flag。 本篇文章结合源码对 zeratool 的实现思路进行分析。通过阅读该文,可以对angr 和 pwn的自动化利用进一步认识。 注:zeratool 基于 angr7 ,不兼容当前的 angr8 使用 Zeratool 主要针对栈溢出和格式化字符串漏洞,实现的漏洞利用方式如下: 栈溢出漏洞——修改 pc:win function / shellcode / rop chain /one gadget 格式化字符串——修改 got 表项: win function / shellcode zeratool 接收 binary 作为参数,同时可以配置其他选项: [chris:~/Zeratool] [angr] python zeratool.py -h usage: zeratool.py [-h] [-l LIBC] [-u URL] [-p PORT] [-v] file positional arguments: file File to analyze optional arguments: -h, --help show this help message and exit # 帮助信息 -l LIBC, --libc LIBC libc to use # 指定 libc -u URL, --url URL Remote URL to pwn # 远程 Url -p PORT, --port PORT Remote port to pwn # 远程端口 -v, --verbose Verbose mode # 设置调试模式 使用示例:...