以 SingPass 应用为例分析 iOS RASP 应用自保护的实现以及绕过方法(上)-天天日报
2023-04-08 13:15:16来源:ZAKER科技
NuDetectSDK 二进制文件也使用相同的混淆器,但它似乎没有参与上图所示的早期越狱检测。另一方面,SingPass 是应用程序的主要二进制文件,我们可以观察到与威胁检测相关的字符串:
(相关资料图)
不幸的是,二进制文件没有泄漏其他字符串,这些字符串可以帮助识别应用程序检测越狱设备的位置和方式,但幸运的是,应用程序没有崩溃。
如果我们假设混淆器在运行时解密字符串,则可以尝试在显示错误消息时转储 __data 部分的内容。在执行时,用于检测越狱设备的字符串可能已被解码并清楚地存在于内存中。
1. 我们运行应用程序并等待越狱消息;
2. 我们使用 Frida 附加到 SingPass,并注入一个库:
2.1 在内存中解析 SingPass 二进制文件;
2.2 转储 __data 部分的内容;
2.3 将转储写入 iPhone 的 /tmp 目录;
一旦数据区被转储,__data 部分会发生以下变化:
转储前后的 __data 部分此外,我们可以观察到以下字符串,它们似乎与混淆器的 RASP 功能有关:
与 RASP 功能相关的字符串所有的 EVT_* 字符串都由一个且只有一个我命名为 on_rasp_detection 的函数引用。这个函数是应用程序开发者在触发 RASP 事件时用来执行操作的威胁检测回调函数。
为了更好地理解这些字符串背后的检查逻辑,让我们从用于检测挂钩函数的 EVT_CODE_PROLOGUE 开始。
EVT_CODE_PROLOGUE:挂钩检测
当通过汇编代码接近 on_rasp_detection 的交叉引用时,我们可以多次发现这种模式:
为了检测给定函数是否被钩住,混淆器加载函数的第一个字节,并将该字节与值 0xFF 进行比较。乍一看,0xFF 似乎是任意的,但事实并非如此。实际上,常规函数以一个序言开始,该序言在堆栈上分配空间,以保存由调用约定定义的寄存器和函数所需的堆栈变量。在 AArch64 中,这个分配可以通过两种方式执行:这些指令是不相等的,如果偏移量存在,它们可能会导致相同的结果。在第二种情况下,指令 sub SP、SP、#CST 用以下字节编码:
正如我们所看到的,该指令的编码从 0xFF 开始。如果不是这样,那么该函数要么以不同的堆栈分配序言开始,要么可能以一个挂钩的蹦床开始。由于应用程序的代码是通过混淆器的编译器编译的,因此编译器能够区分这两种情况,并为正确的函数的序言插入正确的检查。
如果函数指令的第一个字节没有通过检查,则跳转到红色基本块。这个基本块的目的是触发一个用户定义的回调,它将根据应用程序的设计和开发人员的选择来处理检测:
打印错误
应用程序崩溃
破坏内部数据
……
从上图中,我们可以观察到检测回调是从位于 #hook_detect_cbk_ptr 的静态变量加载的。调用此检测回调时,混淆器会向回调提供以下信息:
1. 检测码:EVT_CODE_PROLOGUE 为 0x400;
2. 可能导致应用程序崩溃的受攻击指针;
现在让我们仔细看看检测回调的整体设计。
检测回调
如上一节所述,当混淆器检测到篡改时,它会通过调用存储在地址的静态变量中的检测回调来做出反应:0x10109D760
通过静态分析 hook_detect_cbk,实现似乎破坏了回调参数中提供的指针。另一方面,在运行应用程序时,我们观察到越狱检测消息,而不是应用程序崩溃。如果我们查看在该地址读取或写入的交叉引用,我们会得到以下指令列表:
所以实际上只有一条指令,init_and_check_rasp+01BC,用另一个函数覆盖默认的检测回调:与默认回调相比:hook_detect_cbk(被覆盖的函数)相比,hook_detect_cbk_user_def 不会损坏一个会导致应用程序崩溃的指针。相反,它调用 on_rasp_detection 函数,该函数引用上图中列出的所有字符串 EVT_CODE_TRACING、EVT_CODE_SYSTEM_LIB 等。通过整体查看 init_and_check_rasp 函数,我们可以注意到 X23 寄存器也用于初始化其他静态变量:
X23 写入指令这些内存写入意味着回调 hook_detect_cbk_user_def 用于初始化其他静态变量。特别是,这些其他静态变量很可能用于其他 RASP 检查。通过查看这些静态变量 #EVT_CODE_TRACING_cbk_ptr、#EVT_ENV_JAILBREAK_cbk_ptr 等的交叉引用,我们可以找到执行其他 RASP 检查的位置以及触发它们的条件。
EVT_CODE_SYSTEM_LIB
EVT_ENV_DEBUGGEREVT_ENV_JAILBREAK多亏了 #EVT_* 交叉引用,我们可以静态地通过使用这些 #EVT_* 变量的所有基本块,并突出显示可能触发 RASP 回调的底层检查。在详细检查之前,需要注意以下几点:1. 虽然应用程序使用了一个商业混淆器,除了 RASP 之外,还提供了本地代码混淆,但代码是轻度混淆的,这使得静态汇编代码分析非常容易。
2. 应用程序为所有 RASP 事件设置相同的回调。因此,它简化了 RASP 绕过和应用程序的动态分析。
反调试
SingPass 使用的混淆器版本实现了两种调试检查。首先,它检查父进程 id ( ppid ) 是否与 /sbin/launchd 相同,后者应该为 1。
getppid 通过函数或系统调用调用。如果不是这种情况,它会触发 EVT_ENV_DEBUGGER 事件。第二个检查基于用于访问 extern_proc.p_flag 值的 sysctl。如果此标志包含 P_TRACED 值,则 RASP 例程会触发 EVT_ENV_DEBUGGER 事件。
在 SingPass 二进制中,我们可以在以下地址范围内找到这两个检查的实例:越狱检测
对于大多数越狱检测,混淆器会通过检查设备上是否存在(或不存在)某些文件来尝试检测设备是否已越狱。
借助以下帮助程序,可以使用系统调用或常规函数检查文件或目录:
如上所述,我提到 __data 部分的转储显示与越狱检测相关的字符串,但转储并未显示混淆器使用的所有字符串。通过仔细研究字符串编码机制,可以发现有些字符串是在临时变量中即时解码的。我将在本文的第二部分解释字符串编码机制,这样,我们可以通过在 fopen、utimes 等函数上设置钩子,并在这些调用之后立即转储 __data 部分来揭示字符串。然后,我们可以遍历不同的转储,查看是否出现了新的字符串。
最后,该方法无法对所有字符串进行解码,但可以实现良好的覆盖。用于检测越狱的文件列表在附件中给出。还有一个检测 unc0ver 越狱的特殊检查,包括尝试卸载 /.installed_unc0ver:
0x100E4D814: _unmount ( "/.installedunc0ver" )
环境
混淆器还会检查触发 EVT_ENV_JAILBREAK 事件的环境变量。其中一些检查似乎与代码提升检测有关,但仍会触发 EVT_ENV_JAILBREAK 事件。
startswith ( )从逆向工程的角度来看,startswith ( ) 实际上是作为一个 "or-ed" 的 xor 序列来实现的,以得到一个布尔值。这可能是编译器优化的结果。你可以在位于地址 0x100015684 的基本块中观察这个模式。
高级检测
除了常规检查之外,混淆器还执行高级检查,比如验证 SIP ( 系统完整性保护 ) 的当前状态,更准确地说,是 KEXTS 代码签名状态。
根据我在 iOS 越狱方面的经验,我认为没有越狱会禁用 CSR_ALLOW_UNTRUSTED_KEXTS 标志。相反,我猜它是用来检测应用程序是否在允许这种停用的 Apple M1 上运行。
Assembly range: 0x100004640 – 0x1000046B8混淆器还使用 Sandbox API 来验证是否存在某些路径:
通过这个 API 检查的路径是 OSX 相关的目录,所以我猜它也被用来验证当前代码没有在 Apple Silicon 上被解除。例如,下面是使用 Sandbox API 检查的目录列表:
Assembly range: 0x100ED7684 ( function )
此外,它使用沙盒属性 file-read-metadata 作为 stat ( ) 函数的替代方案。
Assembly range: 0x1000ECA5C – 0x1000ECE54
该应用程序通过私有系统调用使用沙盒 API 来确定是否存在一些越狱工件。这是非常明智的做法,但我想这并不符合苹果的安全政策。
代码符号表
此检查的目的是验证已解析导入的地址是否指向正确的库。换句话说,此检查验证导入表没有被可用于挂钩导入函数的指针篡改。
Initialization: part of sub_100E544E8
Assembly range: 0x100016FC4 – 0x100017024
在 RASP 检查初始化 ( sub_100E544E8 ) 期间,混淆器会手动解析导入的函数。此手动解析是通过迭代 SingPass 二进制文件中的符号、检查导入符号的库、访问(在内存中)此库的 __LINKEDIT 段、解析导出 trie 等来执行的。此手动解析填充一个包含已解析符号的绝对地址的表。
此外,初始化例程设置遵循以下布局的元数据结构:
symbols_index 是一种转换表,它将混淆器已知的索引转换为 __got 或 __la_symbol_ptr 部分中的索引。索引的来源(即 __got 或 __la_symbol_ptr)由包含类枚举整数的 origins 表确定:symbols_index 和 origins 这两个表的长度都是由静态变量 nb_symbols 定义的,它被设置为 0x399。元数据结构后面跟着两个指针:resolved_la_syms 和 resolved_got_syms,它们指向混淆器手动填充的导入地址表。每个部分都有一个专用表:__got 和 __la_symbol_ptr。
然后,macho_la_syms 指向 __la_symbol_ptr 部分的开头,而 macho_got_syms 指向 __got 部分。
最后,stub_helper_start / stub_helper_end 保存了 __stub_helper 部分的内存范围。稍后我将介绍这些值的用途。
这个元数据结构的所有值都是在函数 sub_100E544E8 中进行初始化时设置的。
在 SingPass 二进制文件的不同位置,混淆器使用此元数据信息来验证已解析导入的完整性。它首先访问 symbols_index 和具有固定值的起源:
由于 symbols_index 表包含 uint32_t 值,#0xCA8 匹配 #0x32A ( 起源表的索引 ) 当除以 sizeof ( uint32_t ) : 0xCA8 = 0x32A * sizeof ( uint32_t ) 。换句话说,我们有以下操作:
然后,给定 sym_idx 值并根据符号的来源,该函数访问已解析的 __got 表或已解析的 __la_symbol_ptr 表。此访问是通过位于 sub_100ED6CC0 的辅助函数完成的。可以用下面的伪代码来概括:
比较 section_ptr 和 manual_resolved 的索引 sym_idx 处的条目,如果它们不匹配,则触发事件 #EVT_CODE_SYMBOL_TABLE。实际上,比较涵盖了不同的情况。首先,混淆器处理 sym_idx 处的符号尚未解析的情况。在这种情况下,section_ptr [ sym_idx ] 指向位于 __stub_helper 部分中的符号解析存根。这就是元数据结构包含本节的内存范围的原因:
另外,如果两个指针不匹配,函数会使用 dladdr 来验证它们的位置:
例如,如果导入的函数与 Frida 挂钩,则两个指针可能不匹配。在 origin [ sym_idx ] 被设置为 SYM_ORIGINS::NONE 的情况下,函数跳过检查。因此,我们可以通过用 0 填充原始表来禁用这个 RASP 检查。符号的数量接近元数据结构,元数据结构的地址是由 ___atomic_load 和 ___atomic_store 函数泄露的。
代码跟踪检查代码跟踪检查旨在验证当前没有被跟踪。通过查看 #EVT_CODE_TRACING_cbk_ptr 的交叉引用,我们可以识别出两种验证。
GumExecCtx
EVT_CODE_TRACING 似乎能够检测 Frida 的跟踪检查是否正在运行。这是我第一次观察到这种检查,非常聪明。对于那些想用原始汇编代码进行分析的人,我将使用 SingPass 二进制文件中的这个地址范围:0x10019B6FC – 0x10019B82C。
这是执行 Frida Stalker 检查的函数图:
与 Frida Stalker 检测相关的代码是的,此代码能够检测到 Stalker。让我们从第一个基本块开始。 _pthread_mach_thread_np ( _pthread_self ( ) ) 旨在获取调用此检查的函数的线程 ID。
然后更巧妙的是,MRS ( TPIDRRO_EL0 ) & #-8 用于手动访问线程本地存储区。在 ARM64 上,苹果使用 TPIDRRO_EL0 的最低有效字节来存储 CPU 的数量,而 MSB 包含 TLS 基地址。
然后,第二个基本块(循环的入口)使用键 tlv_idx 访问线程本地变量,在循环中取值范围为 0x100 到 0x200:
以下调用 _vm_region_64 ( ... ) 的基本块用于验证 tlv_addr 变量是否包含具有正确大小(即大于 0x30)的有效地址。在这些情况下,它会通过这些奇怪的内存访问跳转到以下基本块:
触发 EVT_CODE_TRACING 的条件为了弄清楚这些内存访问的含义,我们有必要知道这个函数与 EVT_CODE_TRACING 事件相关联。哪些知名的公共工具可以与代码跟踪相关联?没有太大的风险,我们可以假设存在 Frida Stalker。
如果我们查看 Stalker 的实现,我们会注意到在 gumstalker-arm64.c 中的这种初始化:
所以跟踪者创建了一个线程局部变量,用于存储 GumExecCtx 结构的指针,该结构具有以下布局:如果我们添加这个布局的偏移量并且如果我们实际上内联 GumArm64Writer 结构,我们可以得到这个表示:由于编译器强制对齐,destroy_pending_since 位于偏移量 0x08 而不是 0x04 处。这样一来,我们可以观察到:
* ( tlv_table + 0x18 ) 有效匹配 GumThreadId thread_id 属性;
* ( tlv_table + 0x24 ) 匹配 GumOS target_os;
* ( tlv_table + 0x28 ) 匹配 GumPtrauthSupport ptrauth_support;
GumOS 和 GumPtrauthSupport 是在 gumdefs.h 和 gummemory.h 中定义的枚举,其值如下:
GumOS 包含 6 个条目,从 GUM_OS_WINDOWS = 0 到 GUM_OS_QNX = 5,这类似于 GUM_PTRAUTH_INVALID = 0,而最后一个条目与 GUM_PTRAUTH_SUPPORTED = 2 相关联。因此,前面的奇怪条件被用来对 GumExecCtx 结构进行指纹识别:
防止这种 Stalker 检测的一种方法是使用 _GumExecCtx 结构中的交换字段重新编译 Frida。责任编辑:hnmd003
相关阅读
-
以 SingPass 应用为例分析 iOS RASP 应用自保护的实现以及绕过方法(上)-天天日报
通过在应用程序的安装目录中搜索一些关键字,我们实际上得到了两个结果,它们含有混淆器名称的信息:NuD...
2023-04-08 -
专访蔚来与杜比团队:音乐人可以有足够的信心,作品被原汁原味地传递到车厢 全球聚焦
《无间道》被喻为香港警匪电影的巅峰之作,影片当中刘建明(刘德华饰)与陈永仁(梁朝伟饰)在深水埗鸭...
2023-04-07 -
焦点报道:IDMIX 推出氮化镓潮酷小魔盒,2C1A 接口支持 65W 快充
快充插线板是一种新形态充电设备,它同时兼顾了AC插座与USB充电器功能,深受用户喜爱,但市面上快充插线...
2023-04-07 -
谷歌 Pixel 平板通过相关认证,更多产品信息曝光-全球要闻
继此前谷歌方面已经确认,后续将推出旗下首款平板电脑产品PixelTablet后,陆续被曝光的产品端相关信息也...
2023-04-07
相关阅读
-
以 SingPass 应用为例分析 iOS RASP 应用自保护的实现以及绕过方法(上)-天天日报
通过在应用程序的安装目录中搜索一些关键字,我们实际上得到了两个结果,它们含有混淆器名称的信息:NuD...
-
【世界新要闻】商业运营收入首破百亿 新城控股轻装上阵
村上春树在《海边的卡夫卡》中曾言:“当你穿越了暴风雨,你就不再是原来的那个人。”企业发展亦如是。...
-
每日观察!今年最火的,肯定是民宿:五一假期部分价格翻5倍,有老板称3月就订满
旅游业将期盼押注在五一假期。今年初,西安、长沙、洛阳的“人山人海”在朋友圈里刷屏,近段时间,泰山...
-
苏科大回应凌晨4点发考研录取通知:会逐一打电话确保通知到学生
4月7日,有网友称:凌晨4点半收到苏州科技大学材料科学与工程学院的
-
最资讯丨编程猫客服回应网传取消节假日3倍工资:这个情况不存在
今日,据博主王落北粉丝投稿:编程猫销售总监开500人大会,宣布取消
-
腾讯视频与抖音上演“世纪大和解”,但头腾大战不会结束:天天短讯
腾讯视频将向抖音授权长视频,并明确了二创发布方式和规则。自此,腾讯视频与抖音多年的版权大战落下帷...
-
环球快报:“因加班怼领导”系编造,借谣言发泄情绪终将反噬
面对真假难辨的网络爆料,舆论也要多一些警惕,不要动辄就被别有用心者牵着走,以为自己是在为正义发声...
-
造谣“加班怒怼领导”,煽动公众情绪当休矣
网络不是“法外之地”,如果僭越了守法敬畏心、缺失了言论责任感、淡薄了正确价值观,就必然会被自己制...
-
当前快讯:虎头局大败局:成本失控、资金链断裂,创始人胡亭梦碎上海滩
胡亭后悔了。3月31日上午,虎头局上海绿谷总部沉闷压抑,虎头局创始人胡亭在一众前来讨薪讨款的员工、供...
-
世界播报:2023年世界大健康博览会开幕,爱康携医疗“黑科技”酷炫登场
充满科技感的未来空间里脑海中刚一浮现“握拳”的想法机械手臂就迅速做出对应动作注意!这可不是科幻电...
-
常青科技完成发行工作,正式上市!为打破国际化工巨头垄断持续发力
4月10日,全面注册制下,第一批主板注册制企业将上市交易。早在3月26日晚间,常青科技便(603125 SH)发...
-
新消息丨直播带岗“职”等你来
使用直播招聘这种新方式,求职者通过主播现场展示的视频,能更直观的了解企业情况,为求职带来了便利。
-
推动优质医疗资源扩容下沉,让人人享有健康-精选
近年来,各地组织优质医疗资源到基层开展义诊、健康宣教、带教查房等活动,带动更多医务人员走进基层,...
-
旅游市场持续回暖背后的创新与信心
中国旅游研究院院长戴斌认为,在多重效应叠加之下,我国旅游业的复苏发展将对消费增长与升级发挥重要作...
-
紧抓关键期 加力促匹配——多地多渠道拓岗位稳就业
今年以来,各地坚持拓宽市场化渠道和稳定公共岗位规模结合,支持新就业形态灵活就业,不断扩大岗位供给。
-
从绿色机遇透视中国经济活力 简讯
今天,加快全面转型的中国经济,正涌动着绿色机遇。
-
人民热评:陈某龙造谣被行拘,但加班痛点需直视
据人民网评发文,4月7日晚,四川德阳警方发布称,针对网传涉中国电
-
每日头条!新能源车险保费大增背后:赔付率超油车,行业如何提升利润?
中新经纬4月7日电(李自曼)近日,财险老三家中国人民财产保险股份有限公司(下称人保财险)、中国平安财产...
-
周鸿祎:360 全网数字安全大脑将结合 GPT 能力抵御网络攻击:当前资讯
北京商报讯(记者魏蔚)4月7日,360创始人周鸿祎表示,360很快会将全网数字安全大脑和GPT结合,以更好实...
-
全球热推荐:“百万豪车”三折卖,“馅饼”还是“陷阱”?
中新网4月8日电(中新财经葛成)如果说我想用不到三十万的价格,买台百万级别的全新奔驰旗舰SUV,你一定怀...
-
全国各地区最低工资标准出炉,你的工资不能低于这个数
中新网北京4月8日电(记者李金磊)最新最低工资表公布。人社部网站近日发布了全国各地区最低工资标准情况(...
-
西藏工业经济、数字经济保持良好发展势头
总体来看,西藏工业经济、数字经济保持良好发展势头,今年一季度快速增长,为完成全年目标任务打下了坚...
-
抢抓农时 春耕备耕 快看点
阳春四月,西藏各地陆续进入春耕备耕时节,广袤田野生机勃发。同时,各相关部门根据各自实际情况,早谋...
-
西藏第三次全国土壤普查工作全面启动
近日,西藏自治区第三次全国土壤普查全面铺开推进会暨专项培训班在拉萨举行,标志着西藏第三次全国土壤...
-
天天视点!西藏自治区游泳馆将于4月10日开放
近日,记者从西藏自治区游泳馆了解到,该馆将于4月10日向社会开放服务。
-
历史性突破,IPv6流量首超IPv4,2025年用户及流量规模剑指世界第一!概念股狂飙,通信龙头被两路资金盯上|全球滚动
相比IPv4,IPv6的数据转发路径更短,极大地提高了转发效率。据国家IPv6发展监测平台统计,今年2月,我国...
-
清华大学与蚂蚁集团携手攻坚下一代安全科技_世界今热点
鞭牛士报道 2023年4月7日,清华大学与蚂蚁集团签署合作协议,双方
-
草莓品鉴 比“美” 赛“甜”:今热点
这次参评的品种特别多,除了主栽品种红颜、圣诞红、妙香七号、梦之莹、宝丰、甘露等,还有由新城区科学...
-
优质医疗资源下沉基层
为提升基层卫生服务健康管理能力,更好地为辖区居民提供全面、优质的诊疗服务,该卫生服务中心联合医联...
-
今日讯!严厉打击超量开药、重复开药等行为 27家定点医疗机构存在违规问题被查
专项检查行动以大数据筛查、现场检查为重点,采取结算数据疑点分析、投诉举报线索征集、走访调查等方式...
精彩推荐
阅读排行
精彩推送
- 看热讯:产业旺 村民富 乡村兴...
- 一个人的“通信班”_环球热消息
- 天天观点:传承“墨脱精神” 筑...
- 【世界新视野】西藏公漳浦“半牧...
- 世界新资讯:探访全国海拔最高的...
- 预订机票一分钟内三次变价,春秋...
- 世界即时看!交通部有关部门约谈...
- 天天报道:民族团结进步创建“进...
- 石拐区 民生项目绘就幸福画卷
- 全球球精选!评论:只有争“分”...
- 一季度高新区新增经营主体827户
- 我市首届广电家博会开幕 全球播资讯
- 当前关注:认房不认贷?呼和浩特...
- 专访蔚来与杜比团队:音乐人可以...
- MCN机构游良文化被申请破产,曾...
- 苏炳添不用小米手机被喷?这误会...
- 焦点报道:IDMIX 推出氮化镓潮酷...
- 面向现实世界场景,多语言大数据...
- 今日快看!低至 15 万元,最便...
- 部分用户余额宝页面显示乱码 支...
- 观天下!警方通报网传中电科加班...
- 谷歌 Pixel 平板通过相关认证...
- 王文涛、陈敏尔、张工会见空客 ...
- 32 位应用已死,对安卓手机意味...
- 小熊电器:营收创新高,靓丽业绩...
- 微信官宣:发视频号,可以赚钱了...
- 当前资讯!年薪百万元!这四大专...
- 高压之下如何破题?华侨城A选择...
- 绿动资本张国津:ESG成中国企业...
- 天天简讯:9年“卷”成特斯拉四大...