gpt4 book ai didi

c - gdb 'x' 命令有什么作用?

转载 作者:太空狗 更新时间:2023-10-29 16:38:20 26 4
gpt4 key购买 nike

我正在阅读 book关于黑客攻击,其中有一章是关于汇编的。

以下是我用 C 编写的小程序。

#include <stdio.h>

int main(int argc, char const *argv[])
{
int i;

for (i = 0; i < 10; i++) {
puts("Hello World!");
}

return 0;
}

下面是gdb测试:

(gdb) break main
Breakpoint 1 at 0x40050f: file main.c, line 7.
(gdb) run
Breakpoint 1, main (argc=1, argv=0x7fffffffe708) at main.c:7
7 for (i = 0; i < 10; i++) {
(gdb) disassemble main
Dump of assembler code for function main:
0x0000000000400500 <+0>: push rbp
0x0000000000400501 <+1>: mov rbp,rsp
0x0000000000400504 <+4>: sub rsp,0x20
0x0000000000400508 <+8>: mov DWORD PTR [rbp-0x14],edi
0x000000000040050b <+11>: mov QWORD PTR [rbp-0x20],rsi
=> 0x000000000040050f <+15>: mov DWORD PTR [rbp-0x4],0x0
0x0000000000400516 <+22>: jmp 0x400526 <main+38>
0x0000000000400518 <+24>: mov edi,0x4005c4
0x000000000040051d <+29>: call 0x4003e0 <puts@plt>
0x0000000000400522 <+34>: add DWORD PTR [rbp-0x4],0x1
0x0000000000400526 <+38>: cmp DWORD PTR [rbp-0x4],0x9
0x000000000040052a <+42>: jle 0x400518 <main+24>
0x000000000040052c <+44>: mov eax,0x0
---Type <return> to continue, or q <return> to quit---
0x0000000000400531 <+49>: leave
0x0000000000400532 <+50>: ret
End of assembler dump.

以下部分是我不明白的地方。 请注意,$rip 是“指令指针”,指向 0x000000000040050f <+15>

(gdb) x/x $rip
0x40050f <main+15>: 0x00fc45c7
(gdb) x/12x $rip
0x40050f <main+15>: 0x00fc45c7 0xeb000000 0x05c4bf0e 0xbee80040
0x40051f <main+31>: 0x83fffffe 0x8301fc45 0x7e09fc7d 0x0000b8ec
0x40052f <main+47>: 0xc3c90000 0x1f0f2e66 0x00000084 0x1f0f0000
(gdb) x/8xb $rip
0x40050f <main+15>: 0xc7 0x45 0xfc 0x00 0x00 0x00 0x00 0xeb
(gdb) x/8xh $rip
0x40050f <main+15>: 0x45c7 0x00fc 0x0000 0xeb00 0xbf0e 0x05c4 0x0040 0xbee8
(gdb) x/8xw $rip
0x40050f <main+15>: 0x00fc45c7 0xeb000000 0x05c4bf0e 0xbee80040
0x40051f <main+31>: 0x83fffffe 0x8301fc45 0x7e09fc7d 0x0000b8ec

第一个命令 x/x $rip输出 0x40050f <main+15>: 0x00fc45c7 .

是0x40050f处的指令吗?是0x00fc45c7mov DWORD PTR [rbp-0x4],0x0 相同(0x40050f 处的汇编指令)?

其次,如果是指令,那么命令输出中的十六进制数字是多少 x/12x $rip , x/8xw $rip , x/8xh $rip

最佳答案

关于 (1),你说对了。

至于(2),x 命令最多有 3 个说明符:要打印多少个对象;以何种格式;以及什么物体大小。在您的所有示例中,您都选择打印为十六进制 (x)。对于第一个说明符,您要求打印 12、8、8 个对象。

关于你案例中的最后一个说明符:
x/12x 没有,因此 gdb 默认假设您需要 4 字节 block (GDB 称为“字”,x86 称为“双字”)。通常,我总是会指定您想要什么,而不是退回到默认设置。

x/8xw 对 8 个对象执行相同的操作,就像您现在明确请求的双字一样。

(x 命令默认为您使用的最后一个大小,但启动时的初始默认值为 w 字)


x/8xh 请求 2 个字节的半字大小的 block ,因此对象以 2 个字节的 block 打印。 (相对于 GDB 的标准 32 位字大小的半字;x86 称之为“字”)。

如果您想知道为什么两个相邻值的串联不等于您在双字中打印时报告的值,这是因为 x86 是小端架构。 Erickson 的书中再次详细说明了这意味着什么 - 如果您向前看几页,他会做一些您可能会发现有帮助的计算。简而言之,如果您重新组合它们 (2,1) (4,3),...,您会发现它们匹配。

关于c - gdb 'x' 命令有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20570816/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com