廢除應用程序的ASLR特性
ASLR (Address Space Layout Randomization),即地址空間隨機布局。大部分主流的操作系統都已實現了ASLR,以防范對已知地址進行惡意攻擊。iOS從4.3開始支持ASLR,Android從4.0也支持了ASLR機制。
ASLR的存在,給iOS系統越獄造成了很大的困難,某些不完美越獄方案就是因為攻破不了或者繞不開ASLR,所以每次重新啟動後地址再度隨機偏移,需要重新進行越獄操作。與此同時,ASLR也給應用層攻擊帶來了一些困難,不同進程會造成不同的地址空間偏移,而且在運行時才可確定其偏移量,不易鎖定攻擊地址。
Mach-O文件的文件頭會記錄二進制的屬性標識,有個flag叫做PIE (Position Independent Enable)。開啟了PIE的二進制文件,在執行時會產生ASLR。
我們可以使用otool工具,來查看任意應用程序二進制文件的屬性,以支付寶為例:
otool -hv Portal
有PIE標識,表示該程序在啟動時會產生隨機地址布局。
removePIE 是個去掉PIE flag的工具。
壞消息是,年久失修,它不支持iOS7。
好消息是,我們還有2個變通方法可以走。
創建一個Command Line Tool工程, 然後復制 removePIE.c 代碼到main.c中,並且修改第43行:
<div> <span>if</span><span>(</span><span>currentHeader</span><span>.</span><span>magic</span> <span>==</span> <span>MH_MAGIC</span><span>){</span> <span>//little endian</span></div>添加iOS7的判斷條件:
<div> <span>if</span><span>(</span><span>currentHeader</span><span>.</span><span>magic</span> <span>==</span> <span>MH_MAGIC || currentHeader.magic == 0xbebafeca </span><span>){</span> <span>//little endian</span></div>編譯後生成可執行文件MyRemovePIE. 利用我們編譯生成的MyRemovePIE來處理應用程序:
./MyRemovePIE Portal
這樣以後支付寶Portal再被啟動執行就不會具有ASLR特性了 如何驗證一下結果呢?
把處理過的Portal二進制拷貝回iPhone,啟動支付寶錢包應用,然後gdb該進程,利用info sh命令查看偏移: 偏移量為0,嗯,這下就好了。一些手動處理的過程可以升級為自動了~