在我探索计算机知识的过程中,我偶然发现了一本书,其中有一些章节介绍了反汇编、x86汇编语言以及C语言和x86汇编语言之间的关系。现在我一直在阅读这个 GDB
命令,但我无法完全理解它。
该命令及其结果如下:
(gdb) x/32xw $esp
0xbffff7e0: 0xb8000ce0 0x08048510 0xbffff848 0xb7eafebc
0xbffff7f0: 0x00000002 0xbffff874 0xbffff880 0xb8001898
0xbffff800: 0x00000000 0x00000001 0x00000001 0x00000000
0xbffff810: 0xb7fd6ff4 0xb8000ce0 0x00000000 0xbffff848
0xbffff820: 0x40f5f7f0 0x48e0fe81 0x00000000 0x00000000
0xbffff830: 0x00000000 0xb7ff9300 0xb7eafded 0xb8000ff4
0xbffff840: 0x00000002 0x08048350 0x00000000 0x08048371
0xbffff850: 0x08048474 0x00000002 0xbffff874 0x08048510
据我所知,我下达的命令告诉调试器:
- x(第一个): 检查内存
- 32: 获取接下来的32位
- x: 启用十六进制表示
- w: 显示
Word
大小数据。 **注意:**
我知道我在问esp寄存器,但是我不太理解$在它前面做了什么。当我尝试不使用它时,会出现缺少符号错误,因此我认为它与引用/解引用有关?
困扰我的是,我如何找到所有这些字节?既然我正在检查一个大小为32位的寄存器,那么我不应该只获得32位或4个字节(上面的1行)吗?如果我的假设正确,那么我们在哪里找到剩余的数据?这是否与堆栈和我当前不知道的特定堆栈框架有关?
我很感激您的意见,以便我可以澄清我的思路。
movzx eax,word ptr [rdi]
或cwd
。 - Peter Cordes