Mach-O地址

  1. ASLR
    1.1 什么是ASLR
    1.2 iOS4.3開(kāi)始引入了ASLR技術(shù)
  2. Mach-O的文件結(jié)構(gòu)
  3. 未使用ASLR
  4. 使用了ASLR
  5. 函數(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ī)偏移值
  6. 函數(shù)在Mach-O文件中的位置
    6.1 計(jì)算函數(shù)在Mach-O文件的內(nèi)存地址
    6.2 通過(guò)MachOView查看函數(shù)地址
  7. 全局變量在Mach-O文件的位置
    7.1 測(cè)試代碼
    7.2 計(jì)算全局變量在Mach-O文件的內(nèi)存地址
    7.3 通過(guò)MachOView查看對(duì)應(yīng)的位置
    7.4 那??臻g和堆空間在哪呢?
  8. 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ù)

  1. Mach-O的文件結(jié)構(gòu)
  1. 未使用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)存分布

  1. 使用了ASLR

LC_SEGMENT(__TEXT)的VM Address

0x100000000
ASLR隨機(jī)產(chǎn)生的Offset(偏移)

0x5000
也就是可執(zhí)行文件的內(nèi)存地址

  1. 函數(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的偏移量

  1. 函數(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)中

  1. 全局變量在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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容