ASLR (Address Space Layout Randomization)柏副,即地址空間隨機布局乐严。大部分主流的操作系統(tǒng)都已實現(xiàn)了 ASLR,以防范對已知地址進行惡意攻擊碱蒙。iOS 從 4.3 開始支持 ASLR役衡,Android 從 4.0 也支持了 ASLR 機制。
ASLR 的存在嘁捷,給 iOS 系統(tǒng)越獄造成了很大的困難造成,某些不完美越獄方案就是因為攻破不了或者繞不開 ASLR ,所以每次重新啟動后地址再度隨機偏移雄嚣,需要重新進行越獄操作晒屎。與此同時,ASLR 也給應(yīng)用層攻擊帶來了一些困難缓升,不同進程會造成不同的地址空間偏移鼓鲁,而且在運行時才可確定其偏移量,不易鎖定攻擊地址港谊。
Mach-O 文件的文件頭會記錄二進制的屬性標(biāo)識坐桩,有個 flag 叫做 PIE (Position Independent Enable)。開啟了 PIE 的二進制文件封锉,在執(zhí)行時會產(chǎn)生 ASLR 。
我們可以使用 otool 工具膘螟,來查看任意應(yīng)用程序二進制文件的屬性成福,以支付寶為例:
otool -hv Portal
emovePIE 是個去掉 PIE flag 的工具奴艾。
壞消息是,年久失修内斯,它不支持 iOS7 蕴潦。 好消息是像啼,我們還有 2 個變通方法可以走。
利用 Theos 編譯 removePIE
改編一個 Mac 版的 MyRemovePIE
非越獄開發(fā)者可能不熟悉 Theos 潭苞,低學(xué)習(xí)成本的做法是第二種忽冻,那么讓我們來改編一個 Mac 版的 MyRemovePIE 吧。 (懶得動手的可以直接到這里下載 demo )
創(chuàng)建一個 Command Line Tool 工程此疹,
然后復(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
這樣以后支付寶 Portal 再被啟動執(zhí)行就不會具有 ASLR 特性了
如何驗證一下結(jié)果呢?
把處理過的 Portal 二進制拷貝回 iPhone 蝗碎,啟動支付寶錢包應(yīng)用湖笨,然后 gdb 該進程,利用 info sh 命令查看偏移:
偏移量為 0 蹦骑,嗯慈省,這下就好了。一些手動處理的過程可以升級為自動了~