d3op
| 1 | qemu-system-aarch64 \ | 
| 1 | !/bin/sh | 
说实话本题目有点懵:
| 1 | root@(none):/# id | 
- 看到 root 权限后第一反应是 qemu 逃逸(在阿里云CTF的 wee 那里已经吃过亏了)
| 1 | root@(none):/ | 
- 看到这么多的内核模块,起初以为是 ARM 内核题目,但使用 find . -regex ".*\.ok"查找不到内核模块
使用 sudo mount squashfs-root.img rootfs 挂载镜像,发现里面有 www 目录,猜测该程序可能是一个服务器,但不知道从何处入手
漏洞分析
本题目的漏洞在二进制文件 base64 中:
| 1 | root@(none):/ | 
- 程序提供了一个 base64 加解密功能,底层使用的文件就是 base64
其漏洞藏在函数 sub_4061AC 中:
| 1 | __int64 __fastcall sub_4061AC(__int64 a1, __int64 a2) | 
- 栈溢出漏洞
至于程序怎么到达这个函数我不是很清楚,但按照如下 mygdbinit 进行操作就可以到达:
| 1 | target remote :1234 | 
此时用于调试的 exp 如下:
| 1 | # -*- coding:utf-8 -*- | 
然后在两个 shell 中分别执行如下命令,就可以开始调试了:
| 1 | python exp.py | 
入侵思路
有一个无限栈溢出,于是思路就很简单:
- 使用一个 ROP 执行 mprotect 修改权限
- 然后执行 ORW 的 shellcode
本题目的难点在于:
- 在 ARM 架构下的静态文件中,找下合适的 Gadget
可以在 IDA 中使用 ALT + B 来查找二进制代码:
 
 
最开始是想找 csu_gadget,在发现没有后就找了两个和它接近的 gadget:
| 1 | .text:0000000000407380 loc_407380 ; CODE XREF: sub_4072F4+D4↓j | 
| 1 | .text:000000000043EAAC loc_43EAAC ; CODE XREF: sub_43EA60+A0↓j | 
这里 gadget 缺少对第一个参数 X0 的控制,因此需要第三个 gadget:
| 1 | .text:000000000041F0C0 E0 03 16 2A MOV W0, W22 | 
拼接这3个 gadget,写出组合函数:
| 1 | def ret2csu(func_addr, ret_addr ,arg0, arg1, arg2): | 
反复调试校对数据,最终就可以写入最终 exp:
| 1 | # -*- coding:utf-8 -*- | 
小结:
很久都没有尝试过 ARM 的 ROP 了,通过这个题目复习了一下