3

anjutaを使用して、lubuntu 12.10で次のCプログラムをコンパイルします

int main()
{
return 0;
}

ファイル名はfoobarです

次に、ターミナルを開いてコマンドを書き込みます

ndisasm foobar -b 32 1>asm.txt

(32 ビット命令オプションで foobar を逆アセンブルし、逆アセンブル結果を asm.txt に保存します)

asm.txt を開くと、0x0000 とわかりにくいコードがたくさんあります。

命令jg 0x47(0x7F45) on 0x00000000 and dec esp(0x4C) on 0x00000002 はELFファイル形式の署名のようです。(16 進コード 0x454c46 は ascii で「ELF」であるため)

Linux はこのコードをメモリにロードする可能性があり、実行可能なコードがないため 0x00000000 にジャンプしません。

ここで質問があります。

  1. 開始アドレスのアドレスを知るにはどうすればよいですか?
  2. 無視してもよいコードはどれですか? (おそらく、多くの 0x0000 は無視してもよいでしょうが、それ以外には何がありますか?)
4

1 に答える 1

4

あなたのような最も単純なプログラムでさえ、gccいくつかのライブラリといくつかのオブジェクトファイルをリンクしています(特にcrt0.o、あなたを呼び出し、ELFの開始点mainを含む)。_startまた、バイナリはおそらくいくつかに動的にリンクされているlibc.so.6ため、動的リンカーが必要です(調べるために使用ldd foobarします)。gcc -v何が行われているかを理解するために使用しgccます。また、objdumpには興味深いフラグやオプションがたくさんあります。

また、 Assembly HowtoX86 呼び出し規約この質問X86-64 ABIX86-64 プログラミングに関するこれらの注意事項なども読みたいと思うかもしれません。

于 2012-12-22T13:28:17.167 に答える