1. ASLR的简介;
2. 计算APP中一段代码的真实内存地址;
1. ASLR的简介;
1.1 ASLR的概念:(Address Space Layout Randomization ) 地址空间配置随机加载;是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的的一种技术; iOS4.3开始引入了ASLR技术。
1.2 作用:地址空间配置随机加载利用随机方式配置数据地址空间,使某些敏感数据(例如APP登录注册、支付相关代码)配置到一个恶意程序无法事先获知的地址,令攻击者难以进行攻击。
2.计算APP中一段代码的真实内存地址;
2.1 MachO的组织架构简介:
2.2 使用MachOView分析MachO的组织架构(对MachO文件静态分析、未使用ALSR技术):
① 函数代码存放在__TEXT段中;
② 全局变量存放在__DATA段中;
③ 可执行文件的内存地址是0x0;
④ 代码段(__TEXT)的内存地址,就是LC_SEGMENT_64(__TEXT)中的VM Address;
⑤ LC_SEGMENT_64(__PAGEZERO)的虚拟内存大小在ARM64架构下为:0X100000000,在非ARM64架构下为:0X4000;
⑥ 也可以使用size -l -m -x指令来查看Mach-O的内存分布:
⑦ vim address、vim Size:
⑧ File Offset、File Size:
2.3 MachO文件加载到内存后、ASLR随机产生的Offset(偏移):
① 函数的内存地址(VM Address) = File Offset(LC_SEGMENT_64(__TEXT)的File Offset) + ASLR Offset +__PAGEZERO Size ;
② Hopper、IDA工具只是对MachO文件进行今天分析、所以分析出的地址都是未使用ASLR的VM Address;
(PS : 其中有部分章节是从前人的文章中搬运过来整理而成,这些文章里已经对部分知识点解释的很清楚明了了,我也没有更好的表达方式,所以站在巨人的肩膀上,我只是一个整理者加了部分自己的理解。)