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 了,通过这个题目复习了一下