【发布时间】:2021-04-13 18:42:06
【问题描述】:
我正在阅读这本书 Hacking : The Art of Exploitation,它使用 32 位汇编,而我的机器是 64 位的。现在我明白这不是一件好事,但这就是问题所在。
当我调试这个程序时,
Reading symbols from ./a.out...
(gdb) break main
Breakpoint 1 at 0x113d: file first.c, line 6.
(gdb) run
Starting program: /home/kingvon/Desktop/asm/a.out
Breakpoint 1, main () at first.c:6
6 for(i=0; i < 10; i++){
(gdb) x/3i $rip
=> 0x55555555513d <main+8>: movl $0x0,-0x4(%rbp)
0x555555555144 <main+15>: jmp 0x555555555156 <main+33>
0x555555555146 <main+17>: lea 0xeb7(%rip),%rdi # 0x555555556004
这是我在我的机器上看到的(64 位),
0x55555555513d <main+8>: movl $0x0,-0x4(%rbp)
但在示例中(32 位)给出的说明是:
0x55555555513d <main+8>: mov DWORD PTR [ebp-4],0x0
通过阅读 32 位程序集,很明显这应该意味着机器会将 0 的值移动到存储在 EBP 寄存器中的内存位置减 4。我知道两条指令做同样的事情,但我觉得64 指令看起来并不像它的真正含义。 64条指令如何解释/措辞?我知道 64 位上的寄存器名称不同
【问题讨论】:
-
您展示的两条指令的主要区别不是因为一条是 32 位,一条是 64 位,而是一条是 AT&T 语法,一条是 Intel 语法。操作数颠倒过来,百分号、美元符号和单词“dword ptr”是显着特征。
-
@prl Book 还声明设置为我已经完成的 intel,但 gdb 停留在&t...我试过
echo "set disassembly-flavor intel" > ~/.gdbinit并检查了文件,它说它设置为 intel,但是 gdb继续在 at&t 中打印.....编辑 - .gdbinit 中的错字,gdb 现在在 intel 中打印
标签: assembly x86 32bit-64bit disassembly att