llvm pass pwn学习(WMCTF2024-babysigin)
前言
复现WMCTF时发现都是没怎么接触过的知识,决定把每道题涉及到的知识点都好好学习一下。
参考文章: 点击查看
LLVM简介
LLVM,即Low-Level Virtual Machine,是以C++编写的用于构建编译器模块化和可重用的编译器框架。广泛用于编译器开发、程序分析、优化以及跨平台代码生成。
LLVM维基百科特点
primary 以下内容来自GPT和自身整理
- 模块化设计:LLVM由多个模块组成,如前端、优化器、后端等,这些模块可以单独使用或组合在一起。
- 中间表示(IR):LLVM有一个强大的中间表示(Intermediate Representation),是一种低级、面向静态单赋值的代码表示形式。
- 这种IR既能用于高层次的程序优化,也能用于低层次的机器代码生成。
- 跨平台支持:LLVM支持多种平台和架构(如x86、ARM、PowerPC等),这意味着LLVM编写的程序可以轻松地移植到不同平台。
- 优化:LLVM的优化器可以对代码进行多种优化,如死代码消除、循环优化、内联展开等;这些优化不仅可以在编译时进行,有的也可以在运行时进行。
- 前端支持:LLVM支持多种前端语言,如Clang、Rust、Swift等。
- 后端生成:支持多种CPU架构和指令集,能够高效的生成可执行代码。
LLVM常见命令
环境安装:
primary 命令为直接下载最新版本,但不建议使用最新版本,可以apt查看可下载版本在进行下载
1 | sudo apt install clang |
常用转换命令:
1 | .c -> .ll:clang -emit-llvm -S a.c -o a.ll |
WMCTF2024-Pwn-Babysigin
首先我们拿到手的是WMCTF.so
文件,IDA打开进行静态分析;
既然这是一道LLVM PASS Pwn,我们首先需要知道做这种题目的时候是一个什么思路:
首先找到runOnFunction
是如何重写的,找到之后大致看下代码发现程序应该是调用四个函数,分别为WMCTF_OPEN
,;WMCTF_READ
,WMCTF_MMAP
和WMCTF_WRITE
。
静态分析
这一部分只会放部分分析代码,因为代码有点多。。。。
WMCTF_OPEN
首先是WMCTF_OPEN这个函数调用需要的字符串,即函数名;
中间一部分是进行了一些对文件名及路径的判断,LoadInst
典型是从上层函数或外部环境输入的。
然后是调用父模块参数
WMCTF_READ
和OPEN部分差不多,获取第一个操作数之后转换为llvm::ConstantInt
类型,并检查其是否为0x6666
,若满足,就会读取文件0x40大小的内容分到mmap_addr
处。
WMCTF_MMAP
同上,第一个操作数为0x7890
,就会通过mmap
函数来开辟一块内存给mmap_addr
。
WMCTF_WRITE
检查第一个操作数是否为llvm::LoadInst
类型,如果LoadInst
的操作数为llvm::GlobalVariable
,则判断其值是否为0x8888
,满足这些条件会把mmap_addr
的内容写到&dword_0 + 1
,并根据操作结果输出成功或错误信息。
总结调用函数所需满足条件
- WMCTF_OPEN:
- 参数必须是上层函数传过来的,并有四个嵌套层次去检查参数;
- WMCTF_READ:
- 第一个操作数为
0x6666
;
- 第一个操作数为
- WMCTF_MMAP:
- 第一个操作数为
0x7890
;
- 第一个操作数为
- WMCTF_WRITE:
- 第一个操作数为
0x8888
,并且必须为全局变量。
- 第一个操作数为
解题
LLVM PASS Pwn
脚本编写分为三种语言,首先写C/C++代码用来利用漏洞,然后将其编译为.ll
文件,最后用python导入后利用pwntools与题目进行交互。
exp
我们的C代码需要满足上文中的所有条件:
1 | void WMCTF_OPEN(char *name); |
OK,现在我们写了一个符合所有条件的C文件,现在需要给他编译成.ll
文件:
1 | clang-14 -emit-llvm -S main.c -o main.ll |
直接生成的文件需要修改,不然打不通:
修改后main.ll
内容:
1 | ; ModuleID = 'main.c' |
1 | opt-14 -load ./WMCTF.so -WMCTF -enable-new-pm=0 ./main.ll |
改完之后
- Title: llvm pass pwn学习(WMCTF2024-babysigin)
- Author: Berial
- Created at : 2024-09-13 19:39:35
- Updated at : 2024-09-14 15:10:22
- Link: https://berial.cn/posts/llvm-pass-pwn1/
- License: This work is licensed under CC BY-NC-SA 4.0.