【问题标题】:Position Independent Executables and Android位置无关的可执行文件和 Android
【发布时间】:2015-08-10 12:02:45
【问题描述】:

我编写了一个 .c 源代码(在 Eclipse 中),它使用 libcap 库来获取与网络流量相关的信息。现在我在 Eclipse 中使用 ndk-build 创建了一个可执行二进制文件。我已将 libs/armeabi 文件夹中创建的二进制文件推送到我的 android(root nexus 5,Lollipop)的 /data/local/ 文件夹中,并尝试执行该二进制文件。但是android正在抛出这个错误

错误:仅支持与位置无关的可执行文件 (PIE)

我对 PIE 一无所知,请告诉我如何创建与位置无关的可执行文件。

【问题讨论】:

  • 已解决,只需在Android.mk文件中添加这两行
  • LOCAL_CFLAGS += -fPIE LOCAL_LDFLAGS += -fPIE -pie

标签: android linux android-ndk android-5.0-lollipop


【解决方案1】:

我对 PIE 一无所知,请告诉我如何创建与位置无关的可执行文件。

Position Independent Executable 或 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)?

【讨论】:

【解决方案2】:

我知道这是一个老话题,但这种 hacky 方式可能会节省一些人的时间
使用 Hex-Editor ,找到第 17 个字节,将值 02 更改为 03,就这样!

【讨论】:

  • 实际上,您给定的解决方案已修复了 PIE 异常,但我使用的库有问题。所以最终你的解决方案效果很好!
  • 这个答案只解决了 PIE 错误,但如果你有 3rd 方库,它动态链接到可执行文件,它不会修复(这不是魔术)
  • 不适合我。我得到分段错误错误
猜你喜欢
  • 2019-02-23
  • 1970-01-01
  • 2013-04-24
  • 2015-08-17
  • 2023-03-14
  • 2020-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多