- ASLR
1.1 什么是ASLR
1.2 iOS4.3開(kāi)始引入了ASLR技術(shù) - Mach-O的文件結(jié)構(gòu)
- 未使用ASLR
- 使用了ASLR
- 函數(shù)的內(nèi)存地址
5.1 函數(shù)內(nèi)存地址計(jì)算
5.2 如何獲取函數(shù)的真實(shí)內(nèi)存地址
5.2.1 通過(guò)usb映射端口
5.2.2 登錄手機(jī)
5.2.3 讓手機(jī)開(kāi)啟debugserver服務(wù), 并加入需要調(diào)試的進(jìn)程
5.2.4 通過(guò)電腦的lldb調(diào)試器調(diào)試APP
5.2.5 獲取ASLR的隨機(jī)偏移值 - 函數(shù)在Mach-O文件中的位置
6.1 計(jì)算函數(shù)在Mach-O文件的內(nèi)存地址
6.2 通過(guò)MachOView查看函數(shù)地址 - 全局變量在Mach-O文件的位置
7.1 測(cè)試代碼
7.2 計(jì)算全局變量在Mach-O文件的內(nèi)存地址
7.3 通過(guò)MachOView查看對(duì)應(yīng)的位置
7.4 那??臻g和堆空間在哪呢? - ASLR
1.1 什么是ASLR
Address Space Layout Randomization,地址空間布局隨機(jī)化
是一種針對(duì)緩沖區(qū)溢出的安全保護(hù)技術(shù),通過(guò)對(duì)堆、棧、共享庫(kù)映射等線(xiàn)性區(qū)布局的隨機(jī)化,通過(guò)增加攻擊者預(yù)測(cè)目的地址的難度,防止攻擊者直接定位攻擊代碼位置,達(dá)到阻止溢出攻擊的目的的一種技術(shù)
1.2 iOS4.3開(kāi)始引入了ASLR技術(shù)
- Mach-O的文件結(jié)構(gòu)
- 未使用ASLR
函數(shù)代碼存放在__TEXT段中
全局變量存放在__DATA段中
可執(zhí)行文件的內(nèi)存地址是0x0
代碼段(__TEXT)的內(nèi)存地址
就是LC_SEGMENT(__TEXT)中的VM Address
arm64:0x100000000(8個(gè)0)
非arm64:0x4000(3個(gè)0)
可以使用size -l -m -x來(lái)查看Mach-O的內(nèi)存分布
- 使用了ASLR
LC_SEGMENT(__TEXT)的VM Address
0x100000000
ASLR隨機(jī)產(chǎn)生的Offset(偏移)
0x5000
也就是可執(zhí)行文件的內(nèi)存地址
- 函數(shù)的內(nèi)存地址
5.1 函數(shù)內(nèi)存地址計(jì)算
函數(shù)的內(nèi)存地址(VM Address) = File Offset + ASLR Offset + __PAGEZERO Size
Hopper、IDA中的地址都是未使用ASLR的VM Address
5.2 如何獲取函數(shù)的真實(shí)內(nèi)存地址
5.2.1 通過(guò)usb映射端口
python /opt/python-client/tcprelay.py -t 22:10010 10011:10011
1
連接成功
5.2.2 登錄手機(jī)
注意:要新開(kāi)一個(gè)窗口
ssh -p 10010 root@localhost
1
登錄成功
5.2.3 讓手機(jī)開(kāi)啟debugserver服務(wù), 并加入需要調(diào)試的進(jìn)程
zad-5s:~ root# debugserver *:10011 -a WeChat
1
成功標(biāo)志
5.2.4 通過(guò)電腦的lldb調(diào)試器調(diào)試APP
注意: 新開(kāi)一個(gè)窗口
~ ? lldb
(lldb) process connect connect://localhost:10011
1
2
5.2.5 獲取ASLR的隨機(jī)偏移值
(lldb) image list -o -f
1
紅色框中的值就是ASLR的偏移量
- 函數(shù)在Mach-O文件中的位置
6.1 計(jì)算函數(shù)在Mach-O文件的內(nèi)存地址
隨便找一個(gè)函數(shù)的內(nèi)存地址
他在Mach-O文件中的位置,應(yīng)該減去PageZero文件的大小
在arm64架構(gòu)的Mach-O文件中, PageZero的大小是0x100000000
所以: 函數(shù)在Mach-O文件的內(nèi)存地址是: 0x100006204 - 0x100000000 = 0x6204
6.2 通過(guò)MachOView查看函數(shù)地址
(__TEXT, __text)的內(nèi)存地址從0x4000開(kāi)始
(__TEXT, __stubs)的內(nèi)存地址從0x255718C開(kāi)始
所以, 函數(shù)就在(__TEXT, __text)這個(gè)內(nèi)存當(dāng)中
- 全局變量在Mach-O文件的位置
7.1 測(cè)試代碼
int a = 10;
int b = 20;
int c = 30;
-
(void)viewDidLoad {
[super viewDidLoad];NSLog(@"%p - %p - %p", &a, &b, &c);
NSObject *obj = [NSObject new];
int age = 40;
NSLog(@"%p - %p - %p - %p",
&obj, // 函數(shù)??臻g
obj, // 堆空間
&age, // 函數(shù)??臻g
&a // 數(shù)據(jù)段
);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
打印結(jié)果
2019-05-09 15:58:05.159606 LLDBDemo[995:52608] 0x1000f8dc8 - 0x1000f8dcc - 0x1000f8dd0
2019-05-09 15:58:05.159697 LLDBDemo[995:52608] 0x16fd0de98 - 0x174010f80 - 0x16fd0de94 - 0x1000f8dc8
1
2
7.2 計(jì)算全局變量在Mach-O文件的內(nèi)存地址
計(jì)算ASLR的隨機(jī)偏移量
image list -f -o
1
全局變量在Mach-O文件的內(nèi)存地址
0x1000f8dc8 - 0x100000000 - 0xf0000 = 0x8dc8
1
7.3 通過(guò)MachOView查看對(duì)應(yīng)的位置
a、b、c的值就能找到了
7.4 那??臻g和堆空間在哪呢?
顯然, 0x16fd0de98 - 0x174010f80 - 0x16fd0de94 這幾個(gè)內(nèi)存地址非常非常大
PageZero用來(lái)干什么的呢?
PageZero是一個(gè)安全領(lǐng)域, NULL指針就是指向這里
————————————————
版權(quán)聲明:本文為CSDN博主「goodswifter」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/zhongad007/article/details/90022617