Straw's B1og.

ios学习篇(1)

字数统计: 1.9k阅读时长: 7 min
2024/04/13

ios学习篇(1)

引言

​ 哎,感觉学安卓太难了,没有用过安卓系统,但是之前有过ios越狱经验,干脆直接学ios逆向好了。学了一个星期,才刚把基础题做出来。为了省钱不买mac,就用windows硬搞,吃尽了苦头啊。。。

工具/设备

iphone 7:dopamine(多巴胺),牛蛙助手,巨魔商店,open-ssh,debugserver

windows系统:ssh,爱思助手,ida

无根越狱(仅适配ios17以下版本)

看了很多教程,试过了WinRa1n,直接报错差点成为苹果板砖了。感觉还是多巴胺一键最简单

前置步骤

所需软件

​ 先去把爱思助手下了,爱思能帮你配好很多环境,还有唯一可见的ui,只能执行/var/mobile/Media下的文件

​ 再去下个牛蛙助手官网_苹果助手,BLFGTool这个可以将你下载的ipa进行签名并且安装

​ 签名详细步骤可以跟着【免费免越狱】牛蛙助手iphone手机7天自签名神器 手机上自签 从此告别电脑签名 苹果应用多开_哔哩哔哩_bilibili来操作

中间步骤

​ 在手机上的safari浏览器下一个dopamine(多巴胺)的ipa,然后传到牛蛙助手(如果你有巨魔就用巨魔,因为我的巨魔是越狱后搞得)上进行签名安装,打开多巴胺后,就直接默认设置直接一键越狱即可,后续设置的密码要记住,记得使用sileo越狱商店。

多巴胺

后续步骤

有了sileo以后,就可以添加各种软件源,在源上下载很多插件,工具,软件等,我的字体也是这里改的。

先在sileo中搜Trollstore helper,对巨魔商店进行一个安装(感觉是通过一个ios的漏洞安装的,因为没越狱也能装),巨魔商店是一个一个ipa直接安装的超级牛的工具

巨魔商店

后面在sileo上再装open-ssh和debug-server,方便我们在windows系统中进行终端操作,和ida远程调试

open-ssh

debugserver

最后我喜欢搞一个Filza,一个ios的文件管理器,自带那个权限太低了,啥操作也没有,这个就跟安卓的文件管理器相似了。

ssh连接

确保两台设备在同一网络下,使用ssh,进行连接

1
ssh root@192.168.x.xxx

输入密码,一般默认是alpine或者是你之前越狱设置的密码

ssh连接

这样就成功进入了,ios系统是基于unix系统的,所以一些常见的linux指令也能运行

动态调试

以crack me1这题为例子,来演示一下

ipa

一般给你的文件就是一个ipa的文件(很多正式的ipa都会有带壳,需要对壳进行砸壳处理,但这题没有),相当于安卓里的apk文件,其实本质上都是一个压缩包,用压缩包打开后,进入/Payload/crack me1.app/

ipa文件

就可以看到全部的文件,我们主要用到的是一个mach-o的文件,是mac和ios系统下的可执行文件,就是那个crack me1,关于其他文件是什么,可以自行搜索ipa结构进行分析查看。

将这个ipa传到巨魔商店里进行安装,打开

题目

mach-o

关于怎么判断哪个文件为mach-o文件,其实可以用010中的mach-o的模板看,因为该类文件的文件头和java的.class文件相同,都是CA FE BA BE(咖啡宝贝)

头文件

模板中也能看到很多文件头,函数表,数据库信息等

mach-o结构

当然如果你有mac,使用machoview会更方便

通过010我们也可以看到,这个文件把32位和64位架构全部整合进去了,所以这个文件无论在哪种arm架构下都能正常运行,但我们手机基本用的是arm64,所以我们用ida64对文件进行分析。

main函数

打开,发现也能正常反编译,是使用object-c写的,左边的函数表中有一堆,然后main函数只是一个接口,没有关键函数,所以从AppDelegate,ViewController,GTMBase64这几个大类下手。

iOS应用的启动流程和优化详解 - 掘金 (juejin.cn)

iOS程序入口结构 - 背包の技术 - 博客园 (cnblogs.com)

ida分析

看了一堆文章再加随便乱点以后,发现了关键函数位置ViewController touch

关键函数

1
2
3
4
5
6
7
8
9
v33[2] = self;//指向应用程序的委托对象的指针
v33[1] = (id)a2;//选择器
v33[0] = objc_retain(&cfstr_Crack);//v33="crack"
v2 = +[ViewController DES:KEY:](&OBJC_CLASS___ViewController, "DES:KEY:", string, v33[0]);//DES加密
v32 = objc_retainAutoreleasedReturnValue(v2);//清空释放
v3 = objc_msgSend((id)textfield, "text");//相当于scanf,获取text窗口中的数据
v25 = objc_retainAutoreleasedReturnValue(v3);//清空释放
v24 = (unsigned __int8)objc_msgSend(v32, "isEqualToString:", v25);//比较
objc_release(v25);

DES加密

细看DES加密的函数,要是不给函数名,估计更难看,这边调用了CommonCrypto 库中的 CCCrypt 函数进行加密或解密操作

进入CCCrypt细看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CCCryptorStatus __cdecl CCCrypt(
CCOperation op,
CCAlgorithm alg,
CCOptions options,
const void *key,
size_t keyLength,
const void *iv,
const void *dataIn,
size_t dataInLength,
void *dataOut,
size_t dataOutAvailable,
size_t *dataOutMoved)
{
return _CCCrypt(op, alg, options, key, keyLength, iv, dataIn, dataInLength, dataOut, dataOutAvailable, dataOutMoved);
}
1
2
3
4
5
6
7
8
9
10
11
12
解释一下每个参数的作用:
op: 表示进行加密还是解密操作,可以是 kCCEncrypt 或 kCCDecrypt。
alg: 表示使用的加密算法,例如 kCCAlgorithmAES 表示使用 AES 算法。
options: 用于指定加密选项,例如填充方式等。
key: 表示加密或解密所使用的密钥。
keyLength: 表示密钥的长度。
iv: 表示初始化向量(Initialization Vector),在某些加密模式下会使用到。
dataIn: 表示待加密或解密的数据输入。
dataInLength: 表示待加密或解密的数据输入长度。
dataOut: 表示加密或解密后的数据输出。
dataOutAvailable: 表示输出缓冲区的可用空间大小。
dataOutMoved: 表示实际写入到输出缓冲区的数据长度。

然后根据参数看出来是DES/pkcs7/ECB加密,密文是1hKgkdbhfbeu6755d8fk,密钥是crack,但是自己加密出来结果怎么都是是错的,感觉是密钥填充的问题,哎,要是能动态调试这题就秒杀了。

动态调试

最煎熬的地方,看了无数文章,无限个报错,终于成功动调了。

因为ida本身不自带iphone-server(为什么macos-server都有,iPhone没有?怒了),我们要用其他的方法调试

我先尝试了用网上下载的debug-server,但是因为iphone自身极高的保护,修改了各种权限后,还是一执行就把我kill掉,估计也是因为签名问题,iphone 的保护真是好啊!

于是又搜到sileo中的自带的debugserver,在iphone中安装完debugserver后,就已经在环境变量中能直接使用

1
2
3
4
5
6
7
8
9
debugserver-@(#)PROGRAM:LLDB  PROJECT:lldb-14.0.0
for arm64.
Usage:
debugserver host:port [program-name program-arg1 program-arg2 ...]
debugserver /path/file [program-name program-arg1 program-arg2 ...]
debugserver host:port --attach=<pid>
debugserver /path/file --attach=<pid>
debugserver host:port --attach=<process_name>
debugserver /path/file --attach=<process_name>

将我们的题目在手机中打开

先要查看你所运行的程序的PID,简单的grep查找指令

1
ps aux | grep crack

PID查看

可以看到PID为37918

输入

1
2
debugserver 192.168.x.xxx:3333
电脑的ip 端口(默认)

监听

打开ida,远程调试参数设置

ip设置

那个hostname填的是你手机的ip地址,跟上面的相反

连上后再用attach process输入刚才获取的程序PID,进行附加

端口设置

要慢慢wait,等待各种函数加载好,这样就可以正常调试了,我们在刚才那个分析的判断函数下断个断点

下断点

点进v32

地址

一个地址,再进去

flag

下面就是我们的flag啦

输入我们的app进行验证

验证成功

CATALOG
  1. 1. ios学习篇(1)
    1. 1.1. 引言
    2. 1.2. 工具/设备
    3. 1.3. 无根越狱(仅适配ios17以下版本)
      1. 1.3.1. 前置步骤
      2. 1.3.2. 中间步骤
      3. 1.3.3. 后续步骤
    4. 1.4. ssh连接
    5. 1.5. 动态调试
      1. 1.5.1. ipa
      2. 1.5.2. mach-o
      3. 1.5.3. ida分析
      4. 1.5.4. 动态调试