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/echo
のfile
は次のとおりです。
/ bin/echo:
ELF 64ビットLSB 実行可能ファイル、x86-64、バージョン1(SYSV)、
ダイナミックリンク(共有ライブラリを使用)、GNU/Linux 2.6.24の場合、
BuildID [sha1] = 193e75fc13e9c4599e772b8d79125a5934cf601c、削除済み
基本的に、executable
filesとshared object
filesの違いを知りたいです。
コンパイルされた実行可能ファイルは、実行可能ファイルに対してではなく、共有オブジェクトに対してリンクされる可能性があるという事実を除いて、違いはありません。
一般に、コンパイルするには2つの方法があります1 実行可能ファイル:
これらの各方法を使用することには長所/短所がありますが、それは問題のポイントではありません。
/bin/ntfsck
および/usr/bin/gawk
は共有オブジェクトです。これは、実行可能ファイルがコンパイルされ、それらにリンクされて機能を使用する可能性があることを意味します。/bin/echo
は実行可能ファイルです。これは、実行可能ファイルがnotコンパイルされてから、その機能を使用するためにリンクされる可能性があることを意味します。したがって、/bin/ntfsck
と/usr/bin/gawk
は技術的にコンパイルされたライブラリ(またはリンカーの観点ではオブジェクト)ですが、共有オブジェクトが実行可能ファイルとして実行されるのを妨げるものはありません。
補足として、file
レポート(それぞれ)にも注意してください。
動的にリンク(共有ライブラリを使用)
これは、それらのそれぞれが他の共有オブジェクトにも動的にリンクされる(そしておそらく使用される)ことを意味します。
1.前処理、コンパイル、リンクを含む、より広範な受け入れを意図した「コンパイル」。
もう1つの違いは、executablesには、エントリポイントアドレスオフセットが定義されていることです。つまり、i386の場合は0x08048000、x86の場合は0x00400000、armの場合は0x00010000です。
共有オブジェクトファイルはライブラリだけでなく、実行可能ファイルにすることもできます。実行可能ファイルである場合、そのようなオフセットはありません。 共有オブジェクト実行可能ファイル、つまり、アドレス空間レイアウトランダム化(ASLR)を使用した位置独立実行可能ファイル(PIE)です。したがって、/ proc/pid/mapsファイルを見ると、標準の実行可能ファイルとは対照的に、ロードされたセグメントの場所が実行ごとに異なることがわかります。
この機能の背後にある考え方は、攻撃者がリターン指向のプログラミング攻撃を実行するのを妨げることにより、実行可能ファイルにセキュリティを追加することです。多くのメンテナーは、Fedora 23以降またはUbuntu 17.10など、PIEをデフォルトとして有効にしてパッケージを構築することを決定しました。