Skip to content
ShenYj edited this page Apr 12, 2022 · 1 revision

ASLR

.

简介

iOS 4.3 开始引入了 ASLR 技术

Address Space Layout Randomization, 地址控件布局随机化

是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的的一种技术

引申

  • Mach-O 结构

    • Header
    • Load Commands
    • data

    可以使用 size -l -m -x 来查看 Mach-O 的内存分布,或使用 otool ,还可以借助 MachOView 工具查看

    笔记:Mach-O

  • 载入 VM 前 & 载入 VM 后

    • File Offset: 在 Mach-O 文件中的位置(地址偏移)
    • File Size: 在 Mach-O 文件中的占据的大小
    • VM Address: Virtual Memory Address, 内存地址,在内存中的位置
    • VM Size: Virtual Memory Size, 内存地址,在内存中的位置
    • __PAGEZERO: 在 Mach-O 载入内存时,会存在一个 __PAGEZERO 的段在起始位置,然后紧接着才是 Mach-O 文件中的结构 (Mach-O 文件中不存在,载入VM后才会存在, 在 arm64下 File Size 是 0x100000000, 如果armv7是0x4000)
  • dyld启动过程

    1. 加载dyld到App进程
    2. 加载动态库(包括所依赖的所有动态库)
    3. Rebase
    4. Bind
    5. 初始化Objective C Runtime
    6. 其它的初始化代码

    笔记:应用程序的加载

ASLR的作用

通过 ASLR 对虚拟内存地址进行随机偏移,在虚拟内存中的结构就变为:

  • ASLR随机偏移

  • __PAGEZERO

  • Mach-O (Header + Load Commands + data)

  • 其他

    这里主要以了解 ASLR 作用为主,如果按照 image(模块) 的纬度, Mach-O 就是一个 image,每个动态库也是一个 image,每次程序启动都是首先加载dyld,然后在加载其他image,在载入虚拟内存后,对应的就是一个个 image,每个 image 再排列,所以最后加上了一个 其他

这样函数在 VM Address 中的地址就变成了: ASLR Offset + __PAGEZERO Size + File Offset

防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的

HopperIDA 中的地址都是未使用 ASLR 的 VM Address,减去 __PAGEZERO Size 就是 Mach-O 中的地址

Rebase && Bind 期间,

笔记: 应用程序的加载

Getting Started

Social

Clone this wiki locally