CISCN 2022 初赛 satool writeup

比赛就不说了,已经不想吐槽了

首先关于这道题,llvm的题我也是第一次接触(大概吧),比赛的时候完全没找到洞

只能说藏得真深啊。。。赛后看到有大师傅说了一下洞在哪,就试着复现了一波

这里简单说一下洞在哪吧,找到洞其实做起来不算难,就是可能调shellcode比较花时间。。

首先我们进到 MBAPass 的构造函数,我们可以看到mmap了一块0x1000的内存

然后进到 MBAPass::runOnFunction 这个函数,程序作用看一下题目的readme就能理解

题目的关键点在这部分,剩下的代码都是一些输出结果用的,可以不看

这里首先是把mmap的内存改成了可读可写,然后 MBAPass::handle 对输入的IR代码做了处理

之后把mmap的内存改为可读可执行,然后 MBAPass::callCode 调用

我们进到 MBAPass::handle 函数,看一下漏洞点

这里可以看到漏洞实际上是因为边界判断有问题导致的,生成JIT code的时候长度大于0xFF0会被截断

因此可以错位执行 shellcode(利用movabs放数值的8个Bytes,主要是x86用的是CISC的原因)

漏洞解释起来有点麻烦,如果不理解调试一下就知道了

程序的其余部分就不详细讲解了,IDB传到Github了,有兴趣可以自己下来研究

因为可利用字节数限制的原因,shellcode 需要手写(6个字节可以存放shellcode+2个字节的短jmp)

Github链接:https://github.com/lakwsh/satool

在 “CISCN 2022 初赛 satool writeup” 上有2个观点

发表回复