這兩天逆向一個程序,發現每次image list -o -f 之后,它的基地址都是0x00000,也就是偏移地址是0。 想到這個應該是載入內存時有沒有啟用偏移有關,於是找了下答案:aslr
百度百科對ASLR的定義:
aslr是一種針對緩沖區溢出的安全保護技術,通過對堆、棧、共享庫映射等線性區布局的隨機化,通過增加攻擊者預測目的地址的難度,防止攻擊者直接定位攻擊代碼位置,達到阻止溢出攻擊的目的的一種技術。 百度百科說的比較隱晦,用白話說,就是:ASLR (Address Space Layout Randomization),即地址空間隨機布局。ASLR特性是為了防御攻擊對已經地址的攻擊才加入的,程序在運行時加載的地址都是隨機的,正因如此,所以我們在調試程序的時候下斷點要用程序的文件偏移加上加載到內存的隨機地址。
在有ASLR特性的程序在Mach-o文件頭都會有PIE的標識,用 otool -hv命令查看二進制,最后一列PIE標識:
tong:crack xxxxx$ otool -hv xxxxx Mach header magic cputype cpusubtype caps filetype ncmds sizeofcmds flags MH_MAGIC ARM V7 0x00 EXECUTE 38 4272 NOUNDEFS DYLDLINK TWOLEVEL BINDS_TO_WEAK PIE
再找了個沒有ASLR機制的二進制文件:
tong:1401 xxxx$ otool -hv xxxx Mach header magic cputype cpusubtype caps filetype ncmds sizeofcmds flags MH_MAGIC ARM V7 0x00 EXECUTE 60 6036 NOUNDEFS DYLDLINK TWOLEVEL WEAK_DEFINES BINDS_TO_WEAK
網上也有些去掉PIE標識的軟件,另外還說到有些不完美越獄就是因為ASLR的原因,越獄后,每次重啟都需要重新越獄(原話就是“越獄”,可能就是指現在ios9.1以后的越獄,每次重啟后,都需要重新激活。)
那么,我有個問題,如果沒有了ASLR,是不是每個程序都需要指定一個基地址?且不能沖突?否則,如果兩個程序基礎地址都是0,怎么辦?還望高手告知