1. ホーム
  2. linux

[解決済み] 指定された実行ファイル以外のアセンブリコードをシングルステップで実行するためにgdbを使用すると、"cannot find bounds of current function "というエラーが発生する。

2023-01-06 22:34:40

質問

gdbのターゲット実行ファイルの外にいて、そのターゲットに対応するスタックさえ持っていません。 私は x86 アセンブリの専門家ではないので、アセンブリ コードで何が起こっているかを検証するために、とにかくシングルステップにしたいのです。 残念ながら、gdbはこの単純なアセンブリレベルのデバッギングを拒否します。 適切なブレークポイントを設定し、停止することはできますが、シングルステップで先に進もうとするとすぐに、gdbはエラー "現在の関数の境界が見つかりません"を報告し、EIPは変わりません。

追加の詳細。

機械語コードは gcc asm ステートメントによって生成され、私は objdump -d の出力から、それが実行されているカーネル メモリの場所にそれをコピーしました。 ローダーを使って私のオブジェクト コードを再配置されたアドレスにロードする簡単な方法は気にしませんが、ロードはカーネル モジュールで行われなければならないことを心に留めておいてください。

gdb がこの領域がプログラム コード内にあると信じるようにするために、偽のカーネル モジュールまたはデバッグ情報ファイルを作成して gdb に提供することが、別の選択肢であると思います。

(本当に知りたい人のために説明すると、私は VMware VM 内の Linux カーネル データ領域に実行時にコードを挿入し、VMware Workstation の組み込み gdb スタブを介してカーネルを gdb リモート デバッグしています。 注:私はカーネル エクスプロイトを書いているわけではなく、セキュリティ大学院生としてプロトタイプを書いています)。

(私は、アセンブリ内の各命令にブレークポイントを設定することができます。 これは動作しますが、x86 アセンブリ命令のサイズはさまざまで、再起動するたびにアセンブリの場所が変わるため、しばらくするとかなり手間がかかります)。

どのように解決するのですか?

この場合 stepi または nexti (に省略することができます)。 si または ni ) を使って、マシン・コードをステップ・スルーしてください。