如何在汇编中使用带寄存器的指针?
How to use pointers with registers in assembly?
我正在开展一个项目,我必须通过查看其汇编代码来调试 "binary bomb" 以帮助我们了解汇编。这一行让我很困惑。
cmp (%esi),%eax
je 80486d1 <main+0xaa>
我"solve"因为两个寄存器相等导致代码跳转的时候炸弹,不相等就输了。但是,当我将 %eax 设置为与 %esi 相同的值时,它不会跳转并且我失败了。这是紧接在 cmp 语句之前的 gdb 信息寄存器输出:
eax 0x804a048 134520904
ecx 0x0 0
edx 0x0 0
ebx 0x1 1
esp 0xffffd7c0 0xffffd7c0
ebp 0xffffd9e8 0xffffd9e8
esi 0x804a048 134520904
edi 0xf7fac5a0 -134560352
eip 0x80486c8 0x80486c8 <main+161>
eflags 0x286 [ PF SF IF ]
cs 0x23 35
ss 0x2b 43
ds 0x2b 43
es 0x2b 43
fs 0x0 0
gs 0x63 99
%esi 和 %eax 的值是一样的,但它没有像我预期的那样工作。我唯一能想到的是 (%esi) 是一个指针?我不确定这是如何工作的,因为我是装配新手,可以使用一些技巧来了解这里发生的事情。
是的,(%esi)
表示法表示它是一个指针。 esi 寄存器保存有效地址。
I'm not exactly sure how this works
这是一种基础知识。在不掌握基本汇编程序语法的情况下尝试解决复杂的汇编程序谜题毫无意义。
网络上有许多资源描述了用于 x86 的多种汇编语法。您向我们展示了什么叫做 "AT&T notation for Intel x86",所以这里只是它的一个起点:
https://en.wikibooks.org/wiki/X86_Assembly/GAS_Syntax
我正在开展一个项目,我必须通过查看其汇编代码来调试 "binary bomb" 以帮助我们了解汇编。这一行让我很困惑。
cmp (%esi),%eax
je 80486d1 <main+0xaa>
我"solve"因为两个寄存器相等导致代码跳转的时候炸弹,不相等就输了。但是,当我将 %eax 设置为与 %esi 相同的值时,它不会跳转并且我失败了。这是紧接在 cmp 语句之前的 gdb 信息寄存器输出:
eax 0x804a048 134520904
ecx 0x0 0
edx 0x0 0
ebx 0x1 1
esp 0xffffd7c0 0xffffd7c0
ebp 0xffffd9e8 0xffffd9e8
esi 0x804a048 134520904
edi 0xf7fac5a0 -134560352
eip 0x80486c8 0x80486c8 <main+161>
eflags 0x286 [ PF SF IF ]
cs 0x23 35
ss 0x2b 43
ds 0x2b 43
es 0x2b 43
fs 0x0 0
gs 0x63 99
%esi 和 %eax 的值是一样的,但它没有像我预期的那样工作。我唯一能想到的是 (%esi) 是一个指针?我不确定这是如何工作的,因为我是装配新手,可以使用一些技巧来了解这里发生的事情。
是的,(%esi)
表示法表示它是一个指针。 esi 寄存器保存有效地址。
I'm not exactly sure how this works
这是一种基础知识。在不掌握基本汇编程序语法的情况下尝试解决复杂的汇编程序谜题毫无意义。
网络上有许多资源描述了用于 x86 的多种汇编语法。您向我们展示了什么叫做 "AT&T notation for Intel x86",所以这里只是它的一个起点: https://en.wikibooks.org/wiki/X86_Assembly/GAS_Syntax