Linuxでバイナリがどのように構築されるかを理解する機会はありますか? (そして/または他のUNIX)
コンパイラ、バージョン、時間、フラグなど...
探してみましたが、readelf
あまり見つかりませんでしたが、バイナリコード/部分などを分析する他の方法があるかもしれません。
抽出する方法を知っていますか?
答え1
すべての場合に適用される一貫したアプローチはありませんが、1つのコンパイラで実行されている操作を検索して情報に基づいて推測できます。
GCCは最も簡単です。.comment
GCCバージョン文字列(実行時に取得したものと同じ文字列gcc --version
)を含むセクションを作成します。表示する方法があるかどうかはわかりませんが、readelf
使用objdump
方法は次のとおりです。
objdump -s --section .comment /path/binary
私はあなたの質問の残りの部分を無視したことに気づきました。フラグは通常どこにも保存されません。コメントセクションに表示される可能性が高いですが、この場合は見たことがありません。タイムスタンプの場所はCOFFヘッダーにありますが、ELFにはその場所がないため、コンパイル時間も使用できません。
答え2
どうですか?
readelf -p .comment a.out
答え3
このコマンドを試してみてくださいstrings
。これにより、多くのテキスト出力が生成されます。チェックにより、コンパイラを推測できます。
pubuntu@pubuntu:~$ strings -a a.out |grep -i gcc
GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3
ここで私はそれにコンパイルされていることを知っていますが、gcc
いつでもstrings
出力をファイルにリダイレクトして確認できます。
という非常に良いユーティリティがありますpeid
Windows の場合、Linux では選択肢が見つかりません。
答え4
readelf
または、objdump
両方を行うことができます。
.note.ABI-tag
gccでコンパイルされたELFファイルにはセクションが追加されます.note.gnu.build-id
。どちらも次のように表示できます。
objdump -sj .note.ABI-tag ELFFILE
objdump -sj .note.gnu.build-id ELFFILE
オプション「s」は内容全体を表示することを意味し、「j」は部分名を意味する。このスタイルはセクションの16進コンテンツを取得します。
このコマンドは、readelf -n
ELFFILEの人が読める内容を一度表示します。オプション 'n' はコメントを意味します。あなたが好きなものを選択してください。
ちなみに、あなたはobjcopy
elfファイルに独自のセクションを追加することができます。