llvm基础学习

参考博客1 参考博客2

基础知识

  • 前端后端都不用管,关注llvm IR这个东西
  • llvm IR的头部是一些Target Information
  • target layout

clang 与 llvm

  • 常见指令
.ll 格式:人类可以阅读的文本
.bc 格式:适合机器存储的二进制文件
.c -> .ll:clang -emit-llvm -S a.c -o a.ll
.c -> .bc: clang -emit-llvm -c a.c -o a.bc
.ll -> .bc: llvm-as a.ll -o a.bc
.bc -> .ll: llvm-dis a.bc -o a.ll

opt

  • opt是LLVM的优化器和分析器,可加载指定的模块,对输入的LLVM IR或者LLVM字节码进行优化或分析。CTF题目一般会给出所需版本的opt文件(可用./opt –version查看版本)或者在README文档中告知opt版本。安装好llvm后,可在/usr/lib/llvm-xx/bin/opt路径下找到对应llvm版本的opt文件(一般不开PIE保护)。
  • 需要注意的是,最好使用题目所给opt同版本的clang生成ll或bc文件。如:题目所给的文件是opt-8,就最好使用clang-8 -emit-llvm -S exp.c -o exp.ll命令。
  • LLVM PASS类题目都会给出一个xxx.so,即自定义的LLVM PASS模块,漏洞点就自然会出现在其中。我们可以使用opt -load ./xxx.so -xxx ./exp.{ll/bc}命令加载模块并启动LLVM的优化分析(其中-xxx是xxx.so中注册的PASS的名称,README文档中一般会给出,也可以通过逆向PASS模块得到)。需要注意的是,若题目给了opt文件,就用题目指定的opt文件启动LLVM并调试(如命令./opt-8 …),直接使用opt-8 …命令是用的系统安装的opt,可能会和题目所给的有不同。
  • 在打远程的时候,与内核和QEMU逃逸的题类似:将exp.ll或exp.bc通过base64加密传输到远程服务器,远程服务器会解码,并将得到的LLVM IR传给LLVM运行。