ASLR (Address Space Layout Randomization),即地址空間隨機(jī)布局。大部分主流的操作系統(tǒng)都已實(shí)現(xiàn)了 ASLR,以防范對(duì)已知地址進(jìn)行惡意攻擊。iOS 從 4.3 開始支持 ASLR,Android 從 4.0 也支持了 ASLR 機(jī)制。
ASLR 的存在,給 iOS 系統(tǒng)越獄造成了很大的困難,某些不完美越獄方案就是因?yàn)楣テ撇涣嘶蛘呃@不開 ASLR ,所以每次重新啟動(dòng)后地址再度隨機(jī)偏移,需要重新進(jìn)行越獄操作。與此同時(shí),ASLR 也給應(yīng)用層攻擊帶來了一些困難,不同進(jìn)程會(huì)造成不同的地址空間偏移,而且在運(yùn)行時(shí)才可確定其偏移量,不易鎖定攻擊地址。
Mach-O 文件的文件頭會(huì)記錄二進(jìn)制的屬性標(biāo)識(shí),有個(gè) flag 叫做 PIE (Position Independent Enable)。開啟了 PIE 的二進(jìn)制文件,在執(zhí)行時(shí)會(huì)產(chǎn)生 ASLR 。
我們可以使用 otool 工具,來查看任意應(yīng)用程序二進(jìn)制文件的屬性,以支付寶為例:
otool -hv Portal
http://wiki.jikexueyuan.com/project/ios-security-defense/images/aslr.png" alt="aslr" />
有 PIE 標(biāo)識(shí),表示該程序在啟動(dòng)時(shí)會(huì)產(chǎn)生隨機(jī)地址布局。
http://wiki.jikexueyuan.com/project/ios-security-defense/images/aslr1.jpeg" alt="aslr1" />removePIE 是個(gè)去掉 PIE flag 的工具。
壞消息是,年久失修,它不支持 iOS7 。 好消息是,我們還有 2 個(gè)變通方法可以走。
非越獄開發(fā)者可能不熟悉 Theos ,低學(xué)習(xí)成本的做法是第二種,那么讓我們來改編一個(gè) Mac 版的 MyRemovePIE 吧。 (懶得動(dòng)手的可以直接到這里下載 demo )
創(chuàng)建一個(gè) Command Line Tool 工程,
http://wiki.jikexueyuan.com/project/ios-security-defense/images/aslr2.png" alt="aslr2" />
然后復(fù)制 removePIE.c 代碼到 main.c
中,并且修改第 43 行:
if(currentHeader.magic == MH_MAGIC){ //little endian
添加 iOS7 的判斷條件:
if(currentHeader.magic == MH_MAGIC || currentHeader.magic == 0xbebafeca ){ //little endian
編譯后生成可執(zhí)行文件 MyRemovePIE .
利用我們編譯生成的 MyRemovePIE 來處理應(yīng)用程序:
./MyRemovePIE Portal
http://wiki.jikexueyuan.com/project/ios-security-defense/images/aslr3.png" alt="aslr3" />
這樣以后支付寶 Portal 再被啟動(dòng)執(zhí)行就不會(huì)具有 ASLR 特性了
http://wiki.jikexueyuan.com/project/ios-security-defense/images/aslr4.png" alt="aslr4" />
如何驗(yàn)證一下結(jié)果呢?
把處理過的 Portal 二進(jìn)制拷貝回 iPhone ,啟動(dòng)支付寶錢包應(yīng)用,然后 gdb 該進(jìn)程,利用 info sh 命令查看偏移:
http://wiki.jikexueyuan.com/project/ios-security-defense/images/aslr5.png" alt="aslr5" />
偏移量為 0 ,嗯,這下就好了。一些手動(dòng)處理的過程可以升級(jí)為自動(dòng)了~ http://wiki.jikexueyuan.com/project/ios-security-defense/images/aslr6.jpeg" alt="aslr6" />