web-dev-qa-db-ja.com

独立した実行可能ファイルの位置とAndroid

Libcapライブラリを使用してネットワークトラフィックに関連する情報を取得する.cソースコード(Eclipse)を作成しました。これで、Eclipseでndk-buildを使用して実行可能バイナリを作成しました。 libs/armeabiフォルダーに作成されたバイナリをmy Android(rooted nexus 5、Lollipop)の/ data/local /フォルダーにプッシュし、バイナリを実行しようとしましたが、Androidはこのエラーをスローしています

エラー:位置独立実行可能ファイル(PIE)のみがサポートされています

PIEについては何も知りません。位置に依存しない実行可能ファイルを作成する方法を教えてください。

16
Adi Tiwari

PIEについては何も知りません。位置に依存しない実行可能ファイルを作成する方法を教えてください。

位置独立実行可能ファイルまたはPIEを使用すると、共有オブジェクトのようにプログラムを再配置できます。プログラムを実行するたびに、プログラムを異なるアドレスにロードして、攻撃者が特定のプログラムの状態を推測しにくくすることができます。

PIE実行可能ファイルは、2つの方法のいずれかでコンパイルおよびリンクできます。まず、すべてを-fPIEでコンパイルし、-pieでリンクします。 2番目は、すべてを-fPICでコンパイルし、-pieでリンクします。

共有オブジェクトとプログラムの両方を構築する場合は、-fPICを使用してすべてをコンパイルします。共有オブジェクトを-sharedとリンクし、プログラムを-pieとリンクします。

他の方法ではできません。つまり、すべてを-fPIEでコンパイルして、共有オブジェクトとプログラムの両方をビルドすることはできません。詳細については、GCCマニュアルの コード生成オプション を参照してください。


Androidで注意すべき点が1つあります。4.1より前のPIEでビルドすると、/system/bin/linkerでセグメンテーションエラーが発生します。 PIEはAndroid 4.1で追加され、より低いバージョンがクラッシュします。

問題を回避するためにカスタムリンク/ローダーを提供するように誰かに言われましたが、現時点では参照が見つかりません。

Android 1.5から4.1の セキュリティ拡張機能もご覧ください


エラー:位置独立実行可能ファイル(PIE)のみがサポートされています

はい、それはロリポップの機能です。 Android 5.0のセキュリティ強化 を参照してください。


readelfを使用して、プログラムがPIEでビルドされているかどうかを確認できます。

$ readelf -l my-prog | grep -i "file type"
Elf filetype is DYN (shared object file)

重要な部分はreadelfが報告しているDYN、報告していないEXEEXEは、PIEがないことを意味し、セキュリティ関連の欠陥を引き起こすはずです。


関連、 Android 4.0(ICS)でサポートされている主な実行可能ファイルのPIE(位置に依存しない実行可能ファイル)を参照してください。

18
jww

私はこれが古いトピックであることを知っていますが、このハッキーな方法は一部の人々の時間を節約するかもしれません
Hex-Editorを使用して、17番目のバイトを見つけ、値02を03に変更します。これで完了です!

4