需要解释与 32 位相反的 64 位汇编指令
Need Interpretation of 64bit Assembly Instruction As Opposed to 32bit
我正在阅读使用 32 位汇编的 Hacking : The Art of Exploitation 这本书,而我的机器是 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 [=10=]x0,-0x4(%rbp)
0x555555555144 <main+15>: jmp 0x555555555156 <main+33>
0x555555555146 <main+17>: lea 0xeb7(%rip),%rdi # 0x555555556004
这是我在我的机器上看到的(64 位),
0x55555555513d <main+8>: movl [=11=]x0,-0x4(%rbp)
但在给出的示例(32 位)中说:
0x55555555513d <main+8>: mov DWORD PTR [ebp-4],0x0
从阅读 32 位程序集可以很清楚地看出,这应该意味着机器会将 0 的值移动到存储在 EBP 寄存器中减去 4 的内存位置。我知道这两条指令做同样的事情,但是我觉得 64 指令看起来不像它真正的意思。 64位指令怎么可以interpreted/worded?我知道 64 位的寄存器名称不同
构建 32 位可执行文件可能是最简单的,因此您可以更仔细地阅读本书,gcc -m32
。当您正在学习教程时,不要尝试将教程移植到另一个 OS 或 ISA,这很少能顺利进行。 (例如,不同的调用约定,而不仅仅是不同的大小。)
并且在 GDB 中,使用 set disassembly-flavor intel
获取 GAS .intel_syntax noprefix
反汇编,就像您的书中显示的那样,而不是默认的 AT&T 语法。对于 objdump,使用 objdump -drwC -Mintel
。有关查看 GCC 输出的更多信息,另请参阅 。
(参见 https://whosebug.com/tags/att/info vs. https://whosebug.com/tags/intel_syntax/info)。
这两条指令都是立即数 0 的双字存储,相对于帧指针指向的位置偏移量为 -4。(这就是它如何实现 i=0
因为你在编译时禁用了优化。)
我正在阅读使用 32 位汇编的 Hacking : The Art of Exploitation 这本书,而我的机器是 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 [=10=]x0,-0x4(%rbp)
0x555555555144 <main+15>: jmp 0x555555555156 <main+33>
0x555555555146 <main+17>: lea 0xeb7(%rip),%rdi # 0x555555556004
这是我在我的机器上看到的(64 位),
0x55555555513d <main+8>: movl [=11=]x0,-0x4(%rbp)
但在给出的示例(32 位)中说:
0x55555555513d <main+8>: mov DWORD PTR [ebp-4],0x0
从阅读 32 位程序集可以很清楚地看出,这应该意味着机器会将 0 的值移动到存储在 EBP 寄存器中减去 4 的内存位置。我知道这两条指令做同样的事情,但是我觉得 64 指令看起来不像它真正的意思。 64位指令怎么可以interpreted/worded?我知道 64 位的寄存器名称不同
构建 32 位可执行文件可能是最简单的,因此您可以更仔细地阅读本书,gcc -m32
。当您正在学习教程时,不要尝试将教程移植到另一个 OS 或 ISA,这很少能顺利进行。 (例如,不同的调用约定,而不仅仅是不同的大小。)
并且在 GDB 中,使用 set disassembly-flavor intel
获取 GAS .intel_syntax noprefix
反汇编,就像您的书中显示的那样,而不是默认的 AT&T 语法。对于 objdump,使用 objdump -drwC -Mintel
。有关查看 GCC 输出的更多信息,另请参阅
(参见 https://whosebug.com/tags/att/info vs. https://whosebug.com/tags/intel_syntax/info)。
这两条指令都是立即数 0 的双字存储,相对于帧指针指向的位置偏移量为 -4。(这就是它如何实现 i=0
因为你在编译时禁用了优化。)