2016-06-29 3 views
0

非常に単純なELFプログラム(Linux x86)を逆アセンブルしています。
IDA PROソフトウェアでは、セクションにstdoutstderrがあります。 そして、stdoutまたはstderrの値を設定するものは見つかりませんでした。 どのように動作しますか?
Сanstdoutstderrはnullですか?elf-loaderはstderrとstdoutのアドレスをどのように知っていますか

+0

stdoutとstderrは、cランタイムによって作成されたファイルハンドルです。あなたのプログラムは、システムがすでにそれを作成していると考えています。 http://www.gnu.org/software/libc/manual/html_node/Standard-Streams.html – SnakeDoc

+0

stdoutとstderrは常に.bssの同じメモリアドレスにあるはずですか? – Bob5421

答えて

1

ですから、.bss開始からstdoutstderrにオフセットstdoutとstderrは常に.bssの

で同じメモリアドレスにする必要があります意味は、静的リンク時に決定されます。

.bssの開始アドレスは、ASLR(ヒープ配置ランダム化)の対象です。したがって、与えられたバイナリの場合、stdoutのアドレスは実行ごとに変化する可能性があります。 IDA Proは.bssの中でこのアイテムを知っているか

それはことができる唯一の方法をstdoutまたはstderr

あるノウハウは、シンボルテーブルを介しです。

readelf -Ws ./a.out | egrep 'stdout|stderr' 
nm ./a.out   | egrep 'stdout|stderr' 
nm -D ./a.out  | egrep 'stdout|stderr' 

更新:

が、どのようなシンボルテーブルが

を剥奪された場合に起こることを検討するには、2つのケースがあります。完全に静的リンクあなたからの出力でそれを見る必要があります、およびダイナミックリンク。完全に静的な場合

stderrへのすべての参照を完全に除去することができ、かつstderrがどこにあるIDA Proはは知ることができません。動的にリンクされた場合に

、2つのシンボルテーブルが存在する:(nmで表示)「通常」一方と(nm -Dで表示)動的一つ。 Stripはの正規シンボルテーブルを削除します(ダイナミックシンボルテーブルの削除は意味をなさないため、実行可能ファイルなしでは実行されません)。 IDA proはstderrの動的シンボルテーブルエントリを使用して、そのシンボルがどこにあるかを指定できます。

+0

実際に私が理解していないことは、IDAプロが.bssのこのアイテムが標準出力か標準エラー出力であることを知る方法です。 – Bob5421

+0

@ Bob5421私は答えを更新しました。 –

+0

さて、シンボルテーブルを削除するとどうなりますか? – Bob5421

関連する問題