比赛就不说了,已经不想吐槽了
首先关于这道题,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
师傅能不能给个联系方式一起交流问题捏
你直接发邮件给我吧,[email protected]