2011-12-13 64 views
2

要檢查Android 4.0(ICS)中主要可執行文件的PIE,我在Galaxy Nexus中測試了一些示例程序。結果如下所示:是Android 4.0(ICS)支持的主要可執行文件的PIE(與位置無關的可執行文件)?

"-fPIE" "-pie" TYPE  address 
-------------------------------------------- 
(a) -  - ET_EXE  0x00008000 
(b) x  - ET_EXE  0x00008000 
(c) -  x ET_DYN program crashed 
(d) x  x ET_DYN program crashed 

說明:使用Android NDK R7的Android-14

結果表示,(a)和(b)無 「-pie」 不是隨機的,(c)和(d)「-pie」崩潰。所以,我無法爲主要可執行文件啓用ASLR。崩潰日誌如下所示:

pid: 5306, tid: 5306 >>> ./memdump <<< 
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0000a020 
r0 70000001 r1 b00094fc r2 00000000 r3 0000a020 
r4 b000a078 r5 ffffffff r6 0000a020 r7 be933b98 
r8 b0009910 r9 00000000 10 00000000 fp b0006d3b 
ip 0000200f sp be933b58 lr 00001f50 pc b00041c0 cpsr 00000030 
d0 0000000000000000 d1 0000000000000000 
d2 0000000000000000 d3 0000000000000000 
d4 0000000000000000 d5 0000000000000000 
d6 0000000000000000 d7 0000000000000000 
d8 0000000000000000 d9 0000000000000000 
d10 0000000000000000 d11 0000000000000000 
d12 0000000000000000 d13 0000000000000000 
d14 0000000000000000 d15 0000000000000000 
d16 0000000000000000 d17 0000000000000000 
d18 0000000000000000 d19 0000000000000000 
d20 0000000000000000 d21 0000000000000000 
d22 0000000000000000 d23 0000000000000000 
d24 0000000000000000 d25 0000000000000000 
d26 0000000000000000 d27 0000000000000000 
d28 0000000000000000 d29 0000000000000000 
d30 0000000000000000 d31 0000000000000000 
scr 00000000 

     #00 pc b00041c0 /system/bin/linker 
     #01 lr 00001f50 <unknown> 

code around pc: 
b00041a0 6858e00a 208cf8d4 f8c41885 e00350d8 
b00041b0 0895685a 50dcf8c4 e0013308 44794924 
b00041c0 2d00681d af49f47f 30acf8d4 f8d4b113 
b00041d0 b96110b0 7174f240 9100481e 44784a1e 
b00041e0 491f4b1e 447b447a 68094479 f8d4e7b1 

code around lr: 
00001f30 ffffffff ffffffff ffffffff ffffffff 
00001f40 ffffffff ffffffff ffffffff ffffffff 
00001f50 ffffffff ffffffff ffffffff ffffffff 
00001f60 ffffffff ffffffff ffffffff ffffffff 
00001f70 ffffffff ffffffff ffffffff ffffffff 

stack: 
    be933b18 00000000 
    be933b1c 00000000 
    be933b20 00000000 
    be933b24 00000000 
    be933b28 00000000 
    be933b2c 00000000 
    be933b30 00000000 
    be933b34 00000000 
    be933b38 00000000 
    be933b3c 00000000 
    be933b40 00000000 
    be933b44 00000000 
    be933b48 00000000 
    be933b4c 00000000 
    be933b50 df0027ad 
    be933b54 00000000 
#00 be933b58 00000000 
    be933b5c 00000000 
    be933b60 b000a078 
    be933b64 b000a078 
    be933b68 be933cf1 
    be933b6c 00000118 
    be933b70 b000a078 
    be933b74 b000a078 
    be933b78 b00094f0 
    be933b7c 00000002 
    be933b80 be933b98 
    be933b84 b0009910 
    be933b88 00000000 
    be933b8c 00000000 
    be933b90 b0006d3b /system/bin/linker 
    be933b94 b00047ed /system/bin/linker 
    be933b98 00000000 
    be933b9c 00000000 

對於Android 4.0中支持的主要可執行文件,是不是PIE?

回答

4

我已經找到了問題。 Android不支持主要可執行文件的PIE。該錯誤是由於Android的鏈接器(/bionic/linker/linker.cpp - link_image())。無論二進制類型(ET_EXE或ET_DYN)如何,它總是將可執行ELF二進制文件中的DYNAMIC頭加載到指定爲頭的虛擬地址字段的固定地址。在上面的例子中,指定的地址是0x0000a020,所以SEGV_MAPERR發生在地址上。而且,Android的鏈接器假定二進制文件的實際類型是「ET_EXE」。這是一個恥辱: - <。謝謝。

1

是Android 4.0(ICS)支持的主要可執行文件的PIE(與位置無關的可執行文件)?

在Android 4.1中添加了PIE支持,而不是4.0。請參閱Security Enhancements in Android 1.5 through 4.1

當我嘗試在Android 4.0或更低版本上運行PIE代碼時,我在/system/bin/linker中遇到了段錯誤。你的旅費可能會改變。