ASLR - ShenYj/ShenYj.github.io GitHub Wiki
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启动过程
- 加载dyld到App进程
- 加载动态库(包括所依赖的所有动态库)
- Rebase
- Bind
- 初始化Objective C Runtime
- 其它的初始化代码
笔记:应用程序的加载
通过 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
防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的
在
Hopper、IDA中的地址都是未使用ASLR的 VM Address,减去__PAGEZERO Size就是Mach-O中的地址
在 Rebase && Bind 期间,
笔记: 应用程序的加载
