码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 静态搜索iOS动态链接函数的调用位置


    静态搜索iOS动态链接函数的调用位置

    可执行文件格式mach-O,是在苹果的操作系统 macOS 和 iOS 上使用的一种二进制文件格式。

    在一些iOS安全扫描中,可能存在需要获取函数具体调用位置的需求,能指导用户更精确的定位漏洞。
    现在以NSLog函数为例,用静态方式搜索macho中动态链接函数的具体调用位置。

    目标

    搜索应用macho中调用NSLog函数的具体位置。

    思路

    整个搜索过程,是一个解析macho文件的过程,把二进制数据解析为合适的数据结构。
    用到了macho中多个部分:
    String Table
    Symbol Table
    Dynamic Symbol Table
    Section64(TEXT,stubs)
    Section64(TEXT,text)

    具体步骤

    1、先找到Symbol Talbe 和 String Table在macho文件中的位置

    在Load Commands中找到LC_SYMTAB,能确定StringTable的offset和size,也能找到Symbol Table的offset和Number:

    Symbol Table Offset 是 0x18c478
    Number of Symbols 是 0x9a2d
    String Table offset 是 0x2273b0
    String Table Size 是 0x108d58

    因为每条symbol数据长度是16个字节,也就是0x10,

    所以 Symbol Table 的 size 是 0x9a2d*0x10 = 0x9A2D0
    Symbol Table起始地址是 0x18c478
    结束地址是 0x18c478 + 0x9A2D0 = 0x226748

    String Table 的起始地址是 0x2273b0
    结束地址是 0x2273b0 + 0x108d58 = 0x330108
    因为字符串的长度不固定,在String Table中的每条数据的长度不固定,
    在读取二进制中的String Table数据时,可以用’\x00’作为字符串的分隔符。

    2、遍历String Table,找到_NSLog

    可以先读取macho中的String Table数据,用’\x00’作为分隔符,生成字符串数组,
    遍历字符串数组,判断每条数据是否等于”_NSLog”。

    在 0x23331b 位置找到了 _NSLog,机器码“5F4E534C6F6700”就是”_NSLog\n”字符串。

    49003(16进制是 0xBF6B)是当前字符串的索引号,暂定为 strTab_index = 49003。
    索引号49003是从String Table的起始地址 0x2273b0 开始计算,第49003个字节,
    0x2273b0 + 49003 = 0x23331B,刚好是 _NSLog的起始地址。

    3、根据步骤2中的49003(0xBF6B),可以在SymbolTable中搜索对应的符号

    在MachOView中能看到地址 0x00224988 对应的就是 _NSLog。

    如何通过索引号49003找到匹配的符号表数据呢?
    在步骤1中已知:
    Symbol Table起始地址是 0x18c478 ,
    Symbol Table结束地址是 0x226748。
    在这个macho中,单条Symbol Table的数据大小是0x10。

    仔Symbol Table中第38993条数据的前四个字节的值是0xBF6B,也就是49003,
    与String Table上_NSLog字符串的索引号相同,所以这条数据就对应”_NSLog”:

    38993是当前数据在Symbol Table中的索引号,暂定为 symTab_index = 38993,
    0x18c478 + 38993 * 0x10 = 0x224988 正好是当前数据的地址。

    4、在Dynamic Symbol Table中根据symTab_index查找数据

    在Macho中的Load Commands下的 LC_DYSYMTAB 中能确定Indirect Symbols的位置:

    起始地址:0x226748,有 794 条数据,每条数据大小是0x4。
    遍历Indirect Symbols中的每一条数据,第111条数据中存储的是38993,
    所以这条数据对应的就是”_NSLog”,设置 dySymTab_index = 111
    0x226748 + 111*0x4 = 0x226904

    TEXT,stubs)节查找NSLog函数” class=”reference-link”>5、在 Section64(TEXT,stubs)节查找NSLog函数

    在Mach-O文件中,Section64(TEXT,stubs)节存储的是用于进行间接跳转(indirect jumps)的存根(stubs)。这些存根是为了支持懒加载和符号解析的过程。具体来说,_stubs 节通常包含指向实际目标函数或符号的跳转指令。
    在动态链接时,如果一个函数或符号的地址尚未被解析,链接器会在__stubs节中放置一个跳转指令,该指令在运行时会被替换为实际地址。这有助于在程序执行过程中进行动态解析和加载。

    在Load Commands 中能找到 Section64(TEXT,stubs)节的信息:
    offset 是 0xAE518
    size 是 0xEE8

    所以 Section64(TEXT,stubs)节的位置
    起始地址是 0xAE518
    结束地址是 0xAE518 + 0xEE8 = 0xAF400
    每条数据长度是 0xC

    解析Section64(TEXT,stubs)的二进制数据结构,每条数据大小是0xC,
    因为步骤4中已知 dySymTab_index = 111,所以找到第111条数据:
    0xAE518 + 111*0xC = 0xAEA4C

    地址0xAEA4C 存储的是NSLog符号的跳转指令。
    在Section64(TEXT,text)节中,凡是要调用NSLog函数,都会执行arm指令”bl #0xAEA4C”。

    TEXT,text)节查找调用指令”bl #0xAEA4C”” class=”reference-link”>6、在 Section64(TEXT,text)节查找调用指令”bl #0xAEA4C”

    在Load Commands 中能找到 Section64(TEXT,stubs)节的信息:
    offset 是 0x5C64
    size 是 0xA88B4

    所以 Section64(TEXT,text)节的信息:
    起始地址是 0x5C64
    结束地址是 0x5C64 + 0xA88B4 = 0xAE518

    查找到部分调用 NSLog 函数的指令:

    使用Capstone库把Section64(TEXT,text)中的机器码反编译成arm汇编指令,
    可以批量比较每一条指令是否是”bl #0xAEA4C”,就能知道代码中调用NSLog函数的具体位置。

  • 相关阅读:
    2023二建建筑施工备考第二天Day05
    Mybatis—SqlSource与BoundSql
    Android 签名机制
    电脑重装系统后我的电脑图标怎么添加到桌面上显示
    ARMv8/ARMv9架构下特权程序之间的跳转模型与系统启动探析
    快速入门 git 代码版本管理工具(05)
    (01)ORB-SLAM2源码无死角解析-(54) 闭环线程→闭环检测:寻找闭环候选关键帧 LoopClosing::DetectLoop()
    一文带你看透IP归属地
    nodejs配置
    ES6中的一些新特性
  • 原文地址:https://blog.csdn.net/2301_80488214/article/details/140289651
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号