这几天公司在做个产品,牵涉到iPhone需要越狱,需要拿到手机上的数据,在网上搜索了一遍,关于iOS安全攻防的文章少之又少,发现只有念茜的一系列文章,废话不多说。
首先介绍一下我的环境:Mac系统为OSX Yosemite,Xcode7,iPhoneOS9.0.SDK,手机系统为iOS8.2。基本上都是最新的。
在学习安全攻防之前,最好先了解一下类Linux系统,我们都知道iOS系统是基于UNIX系统的。
一些常用的工具:
ps:显示进程状态,包括cpu使用情况,内存使用情况,进程标志位、内存限制,常驻进程数、处理时间等等
top:动态查看进程状态,包括cpu 使用情况,cpu空闲率、进程优先级等等
nice 和renice:用于为你的应用软件分配更高或更低优先级
lsof: 列举你的而应用软件打开的所有文件,使用的IP地址和打开的socket以及他们的状态
tcpdump:数据包抓取分析工具,相似的还有wireshark等
ifconfig:网络配置查看工具,windows 是ipconfig
route:查看或者配置路由
netstat:查看网络统计数据,打开端口、连接状态的工具
sysctl: 查看和修改内核状态的工具
最重要一个命令:man,可以查看所有命令的使用方法、参数
otool:otool(object file displaying tool 的缩写)工具(对象文件显示工具)在Mac OS X桌面系统自带,它被移植到arm架构下,提供一系列的机制来查看对象文件和动态库文件的信息。这个有用的工具可以用于判断内存偏移值、段大小、目标加密等信息,枚举动态加载依赖性等。可以与调试器(例如gdb)结合起来解密并分析你的应用软件,也是用于反汇编 的重要工具
nm:这是一个查看符号表的工具,可以查看包括函数和方法名,以及他们的加载地址。这些信息可以用于在使用调试器时在内存中定位代码
cycript :cycript是javascript的一个实现,并且可以与Object-C类和目标进行交互,前几篇文章对它有重点介绍。
好了说了这么多,先来点干货
编译HelloWorld
首先找到编译器
$ ls -l /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/
total 8
drwxrwxr-x 8 root wheel 272 10 10 07:34 iPhoneOS.sdk
lrwxr-xr-x 1 root wheel 12 10 27 11:48 iPhoneOS9.1.sdk -> iPhoneOS.sdk
这是我的SDK版本
在https://developer.apple.com/library/ios/documentation/DeveloperTools/Conceptual/WhatsNewXcode/Articles/xcode_5_0.html#//apple_ref/doc/uid/TP40012953-SW18 这篇文章中有这么一句话
Note: LLVM-GCC is not included in Xcode 5.
只要涨了Xcode ,便自带了clang 编译器,可以来确认一下
$ clang
clang: error: no input files
好了,确认有clang
来个经典的
$ vim helloworld.c
#include<stdio.h>
int main(){
printf("hello world!!\n");
return 0;
}
然后编译
$ clang -arch armv7 -isysroot `xcrun --sdk iphoneos --show-sdk-path` -o helloworld helloworld.c
产生一个叫HelloWorld 的二进制文件
$ file helloworld
helloworld: Mach-O executable arm
这里一定要是arm ,才能安装到手机上
然后用otool 工具来看看它的汇编代码
$ otool -tV helloworld -p _main
helloworld:
(__TEXT,__text) section
_main:
0000bf98 b580 push {r7, lr}
0000bf9a 466f mov r7, sp
0000bf9c b082 sub sp, #0x8
0000bf9e f2400042 movw r0, #0x42
0000bfa2 f2c00000 movt r0, #0x0
0000bfa6 4478 add r0, pc
0000bfa8 2100 movs r1, #0x0
0000bfaa 9101 str r1, [sp, #0x4]
0000bfac f000e826 blx 0xbffc @ symbol stub for: _printf
0000bfb0 2100 movs r1, #0x0
0000bfb2 9000 str r0, [sp]
0000bfb4 4608 mov r0, r1
0000bfb6 b002 add sp, #0x8
0000bfb8 bd80 pop {r7, pc}
再来看看这个二进制文件依赖的动态库
$ otool -L helloworld
helloworld:
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1)
字符窜搜索
刚刚我们在程序有个打印动作。我们想看看打印的是什么东西,但这个是arm架构下的程序,在Mac OS下运行不了。这时我们就可以用字符窜搜索对这个二进制文件做字符窜转储。字符窜转储是从一个二进制文件中寻找可打印字符窜,这有助于发现被编译软件中的资源数据,例如,网站URL、查询字符窜,硬编码密码等
$ strings helloworld
hello world!!
我们都知道Linux系统下有个grep 命令
$ strings helloworld |grep -i hello
hello world!!
以上都是一些基础命令和工具
现在来测试一下刚刚编译好的那个二进制文件
把这个文件scp 到越狱手机上
首先对文件签名
$ldid -S helloworld
$./helloworld
好了第一个程序跑起来了