我编写了一个.c源代码(在Eclipse中),它使用libcap库来获取与网络流量相关的信息。现在我已经在Eclipse中使用ndk-build创建了可执行二进制文件。我已将libs / armeabi文件夹中创建的二进制文件推送到我的android(rooted nexus 5,Lollipop)的/ data / local /文件夹中,并尝试执行二进制文件。但是android正在抛出这个错误
错误:仅支持位置独立可执行文件(PIE)
我对PIE一无所知,请告诉我如何创建与位置无关的可执行文件。
答案 0 :(得分:18)
我对PIE一无所知,请告诉我如何创建与位置无关的可执行文件。
位置独立可执行文件或PIE允许重新定位程序,就像共享对象一样。在程序的每次运行中,程序都可以加载到不同的地址,以使攻击者更难猜出某个程序状态。
您可以通过两种方式之一编译和链接PIE可执行文件。首先,使用-fPIE
编译所有内容并与-pie
相关联。第二种是用-fPIC
编译所有内容并与-pie
链接。
如果要构建共享对象和程序,则使用-fPIC
编译所有内容。将共享对象与-shared
相关联,并将该程序与-pie
。
你不能以其他方式做到这一点。也就是说,您无法使用-fPIE
编译所有内容并构建共享对象和程序。有关详细信息,请参阅GCC手册中的Code Generation Options。
在Android上需要注意的一件事:在4.1之前使用PIE构建将导致/system/bin/linker
中的分段错误。 PIE是在Android 4.1上添加的,它崩溃的版本较少。
有人告诉我提供自定义链接/加载程序以避免此问题,但目前我找不到该引用。
另见Security Enhancements in Android 1.5 through 4.1。
错误:仅支持位置独立可执行文件(PIE)
是的,这是一个棒棒糖功能。请参阅Security Enhancements in Android 5.0。
您可以使用readelf
检查程序是否使用PIE构建:
$ readelf -l my-prog | grep -i "file type"
Elf filetype is DYN (shared object file)
重要的部分是readelf
报告 DYN
,而不报告 EXE
即可。 EXE
表示它缺少PIE,并且应该触发与安全相关的缺陷。
相关,请参阅Is PIE (Position-independent executable) for main executables supported in Android 4.0 (ICS)?
答案 1 :(得分:4)
我知道这是一个古老的话题,但这种hacky方式可能会节省一些人的时间 使用十六进制编辑器,找到第17个字节,将值02更改为03,就是这样!