質問:
ASLRを無効にせずに、削除されたPIEバイナリのGDBエントリポイントにブレークポイントを設定します
Zach Riggle
2015-04-19 01:04:56 UTC
view on stackexchange narkive permalink

位置に依存しない、静的にリンクされた、ストリップされたバイナリを考えると、ASLRを無効にせずにエントリポイントにブレークポイントを設定する方法はGDBにはないようです。

  • ブレークスタートおよび同様の関数は、シンボリック情報がないため機能しません
  • set stop-on-solib-events 1 は、バイナリのように機能しません動的にリンクされていない
  • break * 0xdeadbeef は、バイナリが開始するまでエントリポイントが解決されないため、機能しません
  • catch load はライブラリをロードしないため、機能しません
  • start は、 main が定義されておらず、ライブラリが定義されていないため、機能しません。ロード済み

バイナリにパッチを適用せずに、最初に実行された命令でブレークするためにどのメカニズムを使用できますか?

可能ですか?

今から-質問に対する削除された応答は、PIEの静的にリンクされたバイナリは不可能であると述べました。簡単な例はリンカー自体です。

静的です。 lylinked。

  $ ldd / lib / x86_64-linux-gnu / ld-2.19.so静的にリンクされています 

実行可能です。

  $ strace /lib/x86_64-linux-gnu/ld-2.19.soexecve("/lib/x86_64-linux-gnu/ld-2.19.so "、[" / lib / x86_64-linux-gnu /ld-2.19.so "]、[/ * 96 vars * /])= 0brk(0)= 0x7ff787b3d000writev(2、[{"使用法:ld.so [OPTION] ... EXECUTA "...、1373} ]、1Usage:ld.so [OPTION] ... EXECUTABLE-FILE [ARGS-FOR-PROGRAM ...]  

位置に依存しません。

  $ readelf -h /lib/x86_64-linux-gnu/ld-2.19.so | grep DYNタイプ:DYN(共有オブジェクトファイル) 

解決策

これは、利用可能なイベントのいくつかを利用することでPythonで実行できるようです: http://asciinema.org/a/19078

ただし、ネイティブGDBソリューションが必要です。

成功したソリューションはで壊れます。 ASLRを無効にせずに直接実行した場合のld.soの_start 。次のようになります。

  sh $ strip -s /lib/x86_64-linux-gnu/ld-2.19.so -o ld.sosh $ gdb ./ld.so(gdb)$ set disable-randomization off(gdb)$ <yourマジックコマンド>(gdb)$ x / i $ pc = > 0x7f9ba515d2d0:mov rdi、rsp(gdb)$ info proc mapprocess 10432マップされたアドレススペース:Start Addr End Addr Size Offset objfile 0x7f9ba515c000 0x7f9 /ld-2.19.so 0x7f9ba537e000 0x7f9ba5380000 0x2000で0x22000 / LIB / x86_64- LinuxベースのGNU / ld-2.19.so 0x7f9ba5380000 0x7f9ba5381000 0x1000を0x0の0x7fffc34c7000 0x7fffc38ca000 0x403000 0x0の[スタック] 0x7fffc398b000 0x7fffc398d000 0x2000では0x0 [VDSO] 0xffffffffff600000 0xffffffffff601000 0x1000番地が0x0 [vsyscall  
GOTセクションにブレークポイントを設定しようとしましたか?たとえば、 `_libc_start_main()`で。
「位置に依存しない、静的にリンクされた」-GOTはありません。
私の悪い...私はあまりにも速く読んだ。ごめんなさい。
関連:https://stackoverflow.com/questions/10483544/stopping-at-the-first-machine-code-instruction-in-gdb
三 答え:
Zach Riggle
2015-04-23 03:44:02 UTC
view on stackexchange narkive permalink

更新:GDB8.1には starti コマンドがあります。これについては、以下で/ u / ruslan

で説明します。ターゲットプロセスを開始する前に、マップされていないアドレスにブレークポイントを設定すると、これが効果的に行われます。 。これは正しい機能ではなく、ブレークポイントの設定に失敗した場合の副作用です。

 (gdb)break * 0Breakpoint 1 at 0x0(gdb)rStarting program:/ home / user / ld .soブレークポイント1の再設定エラー:警告:ブレークポイント1を挿入できません警告:ブレークポイント1を挿入できませんアドレス0x0(gdb)x / i $ pc = > 0x7faae3a25cd0:mov rdi、 rsp  
Ruslan
2018-01-08 15:58:41 UTC
view on stackexchange narkive permalink

GDB 8.1以降、このための特別なコマンド starti があります。 GDBセッションの例:

  $ gdb / bin / true / bin / trueからシンボルを読み取る...(デバッグシンボルが見つかりません)...完了(gdb)startiStartingプログラム:/ bin / true /lib/ld-linux.so.2(gdbから_startでプログラムstopped.0xf7fdd800())のx / 5I $ PC = > 0xf7fdd800 <_start>:MOV EAX、ESP 0xf7fdd802 <_start + 2>:コール0xf7fe2160 <_dl_start> 0xf7fdd807 <_dl_start_user>:MOV EDI、 eax 0xf7fdd809 <_dl_start_user + 2>:call 0xf7fdd7f0 0xf7fdd80e <_dl_start_user + 7>:add ebx、0x1f7e6  
p0tr3c
2020-02-08 14:20:55 UTC
view on stackexchange narkive permalink

libc_star_mainの最初の引数で中断するようにgdb関数を定義できます。最初のsi / niは、libc自体をロードすることです。 .gdbinitファイルに入れます。

  define bmain si ni b __libc_start_main c b *($ rdi)cend  


このQ&Aは英語から自動的に翻訳されました。オリジナルのコンテンツはstackexchangeで入手できます。これは、配布されているcc by-sa 3.0ライセンスに感謝します。
Loading...