在gdb中运行信息寄存器后,我们将得到类似于以下的输出:小数点第二列,这似乎不一致。某些寄存器(即rsp和rip)即使在第二列中也以十六进制显示相同的值。另一方面,eflags在第二列中显示了这些标志。

gdb这样做的原因是什么?如果要显示相同的信息(在rsp和rip的情况下),这是否多余?此外,这如何在其他架构上推广? (以上输出适用于x86-64)。

源。我重新提出了这个问题,因为我认为我会从逆向工程的角度找到更具体的答案。

#1 楼

实际上,在汇编中,您只能找到三种类型的值:


数字值;
内存地址;
指令(操作码)。

通用寄存器,例如raxrbx,...,用于存储数值(将触发程序的行为)或存储器地址(以了解在何处读取/写入或跳转)。

当然,由于大多数人习惯于将十进制格式用于程序中使用的值,因此当寄存器中可能包含十进制格式时,显示十进制格式很重要。

现在,重要的是要知道内存地址通常以十六进制格式给出(主要是出于紧凑性原因)。并且,通用寄存器可能还包含内存地址。这就是为什么gdb同时显示十进制和十六进制格式的情况,以防万一,另一种最适合当前值。

寄存器rsprip(和rbp)是特殊情况,因为它们特别用于存储地址(仅用于存储地址),因此将此类寄存器的内容转换为十进制格式将毫无用处。这就是为什么gdb只为这些寄存器提供十六进制格式的原因。
最后,rflags / eflags的情况有点特殊,因为该寄存器的含义取决于每个位(请参见下图。



因此,给用户十进制,十六进制或二进制格式不是真正有用(除非您可以将数字与立即标记)。但是,给出设置为“ true”的标志列表(这是您在示例中看到的[ IF ])更为有用。但是,gdb给出了eflags的十六进制值,因为它可以被访问并用作程序中的值(我已经将此作为混淆目的了。)

评论


谢谢恐怖。同样从64bit-core.xml的源文件中,似乎很清楚为什么会发生这种情况。

–Rakholiya Jenish
15年6月25日在7:40