这听起来可能令人难以置信,但我真的想了解代码的内部工作原理,而不仅仅是坚持更高层次的概念。
所以我的问题是这个。我目前正在阅读“黑客和利用的艺术”,当作者在解释 GDB 命令时,他来解释如何检查某个内存地址。
我的问题是命令的输出
(gdb) x/x $eip
Run Code Online (Sandbox Code Playgroud)
我知道 x 代表十六进制,我不明白的是为什么它会显示这个:
0x8048384 <main+16>: 0x00fc45c7
Run Code Online (Sandbox Code Playgroud)
如果我run i r eip的输出是 0x8048384,那么两个输出不应该都是x/x $eip0x8048384 吗?
在相关主题上,诸如此类的目的是什么
(gbd) x/2x $eip
Run Code Online (Sandbox Code Playgroud)
他说是检查同一个地址的多个单元,一个地址怎么会有多个单元?也许我误解了内存地址背后的概念。我认为一个内存位置只能容纳一件事。
如果这似乎是一个愚蠢的问题,我再次道歉。我很乐意提供帮助和进一步研究的链接。我真的很想了解这一点。
在第一个例子(x/x $eip)中,显示的第一个值(0x8048384)是要执行的下一条指令的地址,而显示的第二个值(0x00fc45c7)是在该地址找到的值,即二进制值下一条要执行的指令。
至于你的第二个例子(x/2x $eip),“多个单位”不在相同的地址,而是在给定的地址开始......例如,显示的第一个值(假设 $eip 与您的第一个示例)在地址 0x8048384 处仍为 0x00fc45c7,但下一个值将是下一个地址 0x8048388 中的任何值。"x/x" 非常适合转储地址范围的值,即数组中的值等。
| 归档时间: |
|
| 查看次数: |
658 次 |
| 最近记录: |