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
期间,
笔记: 应用程序的加载