14

gdb は、特定の線形アドレスに対して読み取りまたは書き込みを行う機能を提供します。次に例を示します。

(gdb) x/1wx 0x080483e4
0x80483e4 <main>:       0x83e58955
(gdb) 

しかし、どのように論理アドレスを指定しますか? 次の指示に出くわしました。

   0x0804841a <+6>:     mov    %gs:0x14,%eax

gdb の "%gs:0x14" でメモリを読み取る方法、またはこの論理アドレスをxコマンドで使用できる線形アドレスに変換する方法を教えてください。

注: この命令の後、単に %eax を読み取ることができることはわかっていますが、それは私の関心事ではありません

4

3 に答える 3

5

gdbの「%gs:0x14」でメモリを読み取るにはどうすればよいですか?

できません。GDBが%gs参照するセグメントがどのように設定されているかを知る方法はありません。

または、この論理アドレスをxコマンドで使用できる線形アドレスに変換します

繰り返しますが、一般的にこれを行うことはできません。ただし、32ビットx86 Linuxを使用しているように見えます。そこで、システムコール%gsを介してスレッド記述子を指すように設定されています。set_thread_area

GDBで実行し、パラメーターを調べることができcatch syscall set_thread_areaます(各スレッドにはそのような呼び出しが1つあります)。実際にそれを行うためのコードはここにあります。%gs設定方法がわかったら、に0x14を追加するだけbase_addrで、完了です。

于 2012-04-28T17:56:53.320 に答える
3

Using GDB to read MSRsで回答されているように、これは gdb 8 でレジスタ$fs_baseとを使用して可能$gs_baseです。

于 2021-06-19T22:31:17.857 に答える