This GDBを使用してメモリ内の値を変更する方法を示していますが、与えられた例では、以前に使用されていなかった値を設定するアドレスを選択します。メモリ内の値を変更するアドレスを選択する
例えば、22に戻り値を変更するために、著者は
set {unsigned char}0x00000000004004b9 = 22
しかし、なぜこのアドレス0x00000000004004b9
は、変更するアドレスになりますでしょうか? disas/r
の出力を見ると、アドレス0x00000000004004b9
は使用されていないので、なぜこれを22に設定するのですか?私はどのアドレスが(この例では)disas/r
の出力がそれを表示しない場合、戻り値を変更するに変更する必要があるかを知る方法を理解しようとしています。
コード
$ cat t.c
int main()
{
return 42;
}
$ gcc t.c && ./a.out; echo $?
42
$ gdb --write -q ./a.out
(gdb) disas/r main
Dump of assembler code for function main:
0x00000000004004b4 <+0>: 55 push %rbp
0x00000000004004b5 <+1>: 48 89 e5 mov %rsp,%rbp
0x00000000004004b8 <+4>: b8 2a 00 00 00 mov $0x2a,%eax
0x00000000004004bd <+9>: 5d pop %rbp
0x00000000004004be <+10>: c3 retq
End of assembler dump.
(gdb) set {unsigned char}0x00000000004004b9 = 22
(gdb) disas/r main
Dump of assembler code for function main:
0x00000000004004b4 <+0>: 55 push %rbp
0x00000000004004b5 <+1>: 48 89 e5 mov %rsp,%rbp
0x00000000004004b8 <+4>: b8 16 00 00 00 mov $0x16,%eax <<< ---changed
0x00000000004004bd <+9>: 5d pop %rbp
0x00000000004004be <+10>: c3 retq
End of assembler dump.
(gdb) q
$ ./a.out; echo $?
22 <<<--- Just as desired