web-dev-qa-db-ja.com

実行可能ファイルと共有オブジェクト

find /bin -exec file {} \;を実行中に何かに気付きました:

fileコマンドは、/binの一部のエントリがshared objectsであると報告し、他のエントリはexecutablesとして報告します。例えば、

/ bin/ntfsck:
ELF 64ビットLSB 共有オブジェクト、x86-64、バージョン1(SYSV)、
動的にリンク(共有ライブラリを使用)、GNU/Linux 2.6.24、BuildID [sha1] = 312d93fd0d8653e7236a61db2e67b93c63225a00、ストリップ済み

gawkについても同じレポート

/ usr/bin/gawk:
ELF 64ビットLSB 共有オブジェクト、x86-64、バージョン1(SYSV)、
ダイナミックリンク(共有ライブラリを使用)、GNU/Linux 2.6.24の場合、
BuildID [sha1] = 76bb13aac7e212164bd6e0d7b8a5d92db44543c9、削除済み

対照的に、/bin/echofileは次のとおりです。

/ bin/echo:
ELF 64ビットLSB 実行可能ファイル、x86-64、バージョン1(SYSV)、
ダイナミックリンク(共有ライブラリを使用)、GNU/Linux 2.6.24の場合、
BuildID [sha1] = 193e75fc13e9c4599e772b8d79125a5934cf601c、削除済み

基本的に、executable filesとshared object filesの違いを知りたいです。

13

Tl; dr

コンパイルされた実行可能ファイルは、実行可能ファイルに対してではなく、共有オブジェクトに対してリンクされる可能性があるという事実を除いて、違いはありません。


一般に、コンパイルするには2つの方法があります1 実行可能ファイル:

  • 静的リンクの使用:ソースコードに含まれる外部ライブラリがコンパイルされ、コンパイルされたライブラリ(またはリンカーの観点ではオブジェクト)が実行可能ファイル自体に追加されます。
  • 動的リンクの使用:ソースコードに含まれる外部ライブラリはコンパイルされますが、コンパイルされたライブラリ(またはリンカーの観点ではオブジェクト)へのリンクは実行可能ファイルに追加されます(コンパイルされたライブラリ/オブジェクトは必要に応じて実行時にリンカー);

これらの各方法を使用することには長所/短所がありますが、それは問題のポイントではありません。

  • /bin/ntfsckおよび/usr/bin/gawkは共有オブジェクトです。これは、実行可能ファイルがコンパイルされ、それらにリンクされて機能を使用する可能性があることを意味します。
  • /bin/echoは実行可能ファイルです。これは、実行可能ファイルがnotコンパイルされてから、その機能を使用するためにリンクされる可能性があることを意味します。

したがって、/bin/ntfsck/usr/bin/gawkは技術的にコンパイルされたライブラリ(またはリンカーの観点ではオブジェクト)ですが、共有オブジェクトが実行可能ファイルとして実行されるのを妨げるものはありません。

補足として、fileレポート(それぞれ)にも注意してください。

動的にリンク(共有ライブラリを使用)

これは、それらのそれぞれが他の共有オブジェクトにも動的にリンクされる(そしておそらく使用される)ことを意味します。


1.前処理、コンパイル、リンクを含む、より広範な受け入れを意図した「コンパイル」。

13
kos

もう1つの違いは、executablesには、エントリポイントアドレスオフセットが定義されていることです。つまり、i386の場合は0x08048000、x86の場合は0x00400000、armの場合は0x00010000です。

共有オブジェクトファイルはライブラリだけでなく、実行可能ファイルにすることもできます。実行可能ファイルである場合、そのようなオフセットはありません。 共有オブジェクト実行可能ファイル、つまり、アドレス空間レイアウトランダム化(ASLR)を使用した位置独立実行可能ファイル(PIE)です。したがって、/ proc/pid/mapsファイルを見ると、標準の実行可能ファイルとは対照的に、ロードされたセグメントの場所が実行ごとに異なることがわかります。

この機能の背後にある考え方は、攻撃者がリターン指向のプログラミング攻撃を実行するのを妨げることにより、実行可能ファイルにセキュリティを追加することです。多くのメンテナーは、Fedora 23以降またはUbuntu 17.10など、PIEをデフォルトとして有効にしてパッケージを構築することを決定しました。

4
florian