0

コースのクラッシュ バック トレース プログラムを作成しています。提供されたスターター コードは、クラッシュ時に %eip を提供し、ランタイム スタックのバックトレースを出力することになっています。

最初のステップは、トップ スタックの %ebp を取得することのようです。私たちの割り当ては、「現在のベース ポインターに対する固定位置が保証されている C コードでアクセス可能なもの」があることを示しています。

私が考えることができる唯一のことは、関数への引数が %ebp の上の固定された場所に格納されていることですが、この情報を使用する方法は考えられません。

この %ebp を C コードだけで (インライン アセンブリなどを使用せずに) 見つける方法は何ですか?

正しい方向へのポンティングは大歓迎です!私は x86-32 ビットを使用しています。

4

2 に答える 2

1

Linux/UNIX用にタスクが与えられていると思います。

提供されたスターターコードは、クラッシュ時に%eipを提供します。

だから、あなたは今SIGSEGVハンドラーにいて、eip from ....コンテキストを持っています-ハンドラーの3番目のパラメーター?

最初の方法:

シグナルハンドラは、アプリケーションのスタックで開始されます。また、ローカル変数のアドレスを取得する場合は、スタックへのポインターを取得します。

 void sigsegv_handler(int signo, siginfo_t *info, void *context)
 {
   int a;
   void * ptr = &a;
   void * ptr_epb = ptr+0x**; 
   // 0x** is an unknown offset, find in disassembly or in debugger
 }

一般化されたケースについて話している場合、これは一般に「現在のベースポインタに対して保証された固定位置」ではありません(Cプログラミング言語標準および/または一部のUNIX仕様によれば、これは未定義の動作である必要があります)。ただし、x86/x86_64の場合。いくつかの固定コンパイラ。コンパイラオプションの固定セット。スタックに保存するフレームポインタを有効にすると、このオフセットは一定になります。

2番目の方法:

ucontext.h(/ usr / include / sys)を確認し、ハンドラーの3番目の引数を介してハックします。

于 2012-08-07T20:48:35.470 に答える