AArch64-Csu&Mprotect_Exploit
程序分析-Shanghai2018_baby_arm
惯例checksec
首先看到的是一个64位arm的程序,在使用qemu用户态启动程序时其命令也稍有区别
1 | ❯ qemu-aarch64 -L /usr/aarch64-linux-gnu/ -g 1234 pwn |
运行起来看就是两次输出,接下来我们到ida中来分析
第一次的read是将数据写到了一个bss段中
而第二次read时便出现了很明显的栈溢出漏洞
对此第一个想法就是ret2shellcode 将shellcode写到第一次输入的点中,在第二次输入时控制pc跳转到该地址执行shellcode
但是不尽人意之处便是该地址并无可执行权限,也就是说即使跳转到该地址也无法执行我们的shellcode
此时返回ida继续分析,可以看到程序中还存在一个mprotect函数,这就是我们的转折点,可以利用该函数来讲bss段地址的权限改为可读可写可执行,那样就可以执行我们的shellcode了
漏洞利用
Arch64中类似x86 csu_init的代码段
首先由于程序中找不到可以直接控制x1、x2、x3寄存器的gadgets,因此便只能另辟蹊径,一个类似x86程序中ret2csu的利用手法,通过两个代码段的逐步执行,最终将mprotect的三个参数逐一存放到x1、x2、x3寄存器中。也就是下图中的两段gadget
第一段gadget
其过程大致为将栈中的数据逐步传递给该步骤中几个关键的寄存器 x21、x22、x23、x24
其执行过后的寄存器变化,x30的值便是csu_up 的地址
第二段gadget
通过上一段gadget的寄存器赋值,我们mprotect的参数已经到了x21、x22、x23、x24,通过跳转到4008ac这个第二段gadget后他将会将参数依次传递到x0、x1、x2、x3,寄存器当中
到最后时,还会将x19和x20做比较判断,即上一段中的:
1 | payload2 += p64(0) + p64(1) # 0&1 用于后续的csuup 代码段校验CMP X19, X20 |
最后的exp
1 |
|
附上某大师傅画的过程示意图:
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 偏有宸机!
评论