欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

看我如何绕过 iPhone XS 中指针验证机制(下)

来源:本站整理 作者:佚名 时间:2019-02-28 TAG: 我要投稿

上一章中,我们对当前的PAC机制在理论上提出了一些可能的漏洞,这一章结合实际的 A12 设备进行验证。该篇可能会比较长,如果大家没有耐心,可以直接跳转到 一节。
 
寻找内核代码执行的入口点
现在我们已经对如何在 A12 设备上绕过和伪造 PAC 有了一些理论的想法,接下来,我们将要研究如何真正的绕过 PAC 来执行内核中的任意代码。
传统的读写内核代码的方法是 Stefan Esser 在Tales from iOS 6 Exploitation中提到的 iokit_user_client_trap 策略。此策略需要 patch IOUserClient 实例的 vtable 来调用用户态的函数 IOConnectTrap6(),它可以调用任意函数,并且传入最多7个参数。这样就能在内核中调用 iokit_user_client_trap() 函数了。如果想要了解其工作原理,可以参考下面 XNU 4903.221.2 中 iokit_user_client_trap() 的实现:
kern_return_t iokit_user_client_trap(struct iokit_user_client_trap_args *args)
{
   kern_return_t result = kIOReturnBadArgument;
   IOUserClient *userClient;
   if ((userClient = OSDynamicCast(IOUserClient,
           iokit_lookup_connect_ref_current_task((mach_port_name_t)
               (uintptr_t)args->userClientRef)))) {
       IOExternalTrap *trap;
       IOService *target = NULL;
       trap = userClient->getTargetAndTrapForIndex(&target, args->index);
       if (trap && target) {
           IOTrap func;
           func = trap->func;
           if (func) {
               result = (target->*func)(args->p1, args->p2, args->p3,
                                        args->p4, args->p5, args->p6);
           }
       }
       iokit_remove_connect_reference(userClient);
   }
   return result;
}
如果我们能够 patch IOUserClient 实例,使得 getTargetAndTrapForIndex() 返回的 trap 和 target 是我们可控的值,那么下面调用 target->func 将可以调用任意内核函数,并且传入最多7个参数(p1 到 p6 加上 target 本身)。
为了了解这个策略在 A12 设备上能否成功,让我们来看看 PAC 引入的对这个功能的更改。
iokit_user_client_trap
   PACIBSP
   ...        ;; Call iokit_lookup_connect_ref_current_task() on
   ...        ;; args->userClientRef and cast the result to IOUserClient.
loc_FFFFFFF00808FF00
   STR        XZR, [SP,#0x30+var_28]  ;; target = NULL
   LDR        X8, [X19]               ;; x19 = userClient, x8 = ->vtable
   AUTDZA     X8                      ;; validate vtable's PAC
   ADD        X9, X8, #0x5C0          ;; x9 = pointer to vmethod in vtable
   LDR        X8, [X8,#0x5C0]         ;; x8 = vmethod getTargetAndTrapForIndex
   MOVK       X9, #0x2BCB,LSL#48      ;; x9 = 2BCB`vmethod_pointer
   LDR        W2, [X20,#8]            ;; w2 = args->index
   ADD        X1, SP, #0x30+var_28    ;; x1 = &target
   MOV        X0, X19                 ;; x0 = userClient
   BLRAA      X8, X9                  ;; PAC call ->getTargetAndTrapForIndex
   LDR        X9, [SP,#0x30+var_28]   ;; x9 = target
   CMP        X0, #0
   CCMP       X9, #0, #4, NE
   B.EQ       loc_FFFFFFF00808FF84    ;; if !trap || !target

[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载