Zach Riggle
2015-04-19 01:04:56 UTC
位置に依存しない、静的にリンクされた、ストリップされたバイナリを考えると、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