gpt4 book ai didi

c - 汇编中的 lea 运算符使用寄存器的三参数算术

转载 作者:行者123 更新时间:2023-11-30 19:52:42 25 4
gpt4 key购买 nike

我再次在寻找最基本问题的答案时遇到问题。这次我正在为类作业研究二元炸弹的第二阶段。我将在下面发布反汇编代码。

我很难理解 <+107> 线上发生的事情。据我所知,到目前为止,它试图将 ((4 * %edx) + %eax) 算术运算中的地址加载到 %eax 寄存器中。到目前为止,我很可能是错的,这就是我的寄存器中的内容,其中 x、y、z 是调用 scanf 时输入的三个参数:

%eax: y

%edx:z

因此,程序正在尝试加载 ((4*z)+y) 的地址?我不知道这个值会是什么样子才能存储到 %eax 中。

我的问题涉及二进制炸弹中 lea 指令的具体应用。我之前读过这里的帖子:What's the purpose of the LEA instruction?但我仍然不明白它如何应用于我的场景。

   0x08048764 <+0>:     sub    $0x3c,%esp
0x08048767 <+3>: lea 0x2c(%esp),%eax
0x0804876b <+7>: mov %eax,0x10(%esp)
0x0804876f <+11>: lea 0x28(%esp),%eax
0x08048773 <+15>: mov %eax,0xc(%esp)
0x08048777 <+19>: lea 0x24(%esp),%eax
0x0804877b <+23>: mov %eax,0x8(%esp)
0x0804877f <+27>: movl $0x8048ba7,0x4(%esp)
0x08048787 <+35>: mov 0x804b040,%eax
0x0804878c <+40>: mov %eax,(%esp)
0x0804878f <+43>: call 0x8048480 <__isoc99_fscanf@plt>
0x08048794 <+48>: cmp $0x3,%eax
0x08048797 <+51>: je 0x80487a5 <phase_2_of_5+65>
0x08048799 <+53>: movl $0x2,(%esp)
0x080487a0 <+60>: call 0x80486ef <explode>
0x080487a5 <+65>: mov 0x24(%esp),%edx
0x080487a9 <+69>: cmp $0x4,%edx
0x080487ac <+72>: jg 0x80487ba <phase_2_of_5+86>
0x080487ae <+74>: movl $0x2,(%esp)
0x080487b5 <+81>: call 0x80486ef <explode>
0x080487ba <+86>: mov 0x28(%esp),%eax
0x080487be <+90>: cmp $0xa,%eax
0x080487c1 <+93>: jle 0x80487cf <phase_2_of_5+107>
0x080487c3 <+95>: movl $0x2,(%esp)
0x080487ca <+102>: call 0x80486ef <explode>
0x080487cf <+107>: lea (%eax,%edx,4),%eax
0x080487d2 <+110>: cmp 0x2c(%esp),%eax
0x080487d6 <+114>: je 0x80487e4 <phase_2_of_5+128>
0x080487d8 <+116>: movl $0x2,(%esp)
0x080487df <+123>: call 0x80486ef <explode>
0x080487e4 <+128>: add $0x3c,%esp
0x080487e7 <+131>: ret

最佳答案

Okay, so are you telling me that after the operation, eax will contain the value of that calculation and not the address? E.g. if eax contains 4 and edx contains 5, then eax will become 24?

该值变为 24,但 EAX 中的是该值的地址,而不是该值本身。因此,当您执行寄存器转储时,您将在 EAX 中看到类似于 0x12345678 的值,而不是 0x00000018。它本质上是一个指针。

也就是说,如果您试图避免 <+123> 处的调用,则通过 LEA 加载到 EAX 中的地址必须等于 ESP+2c 处的地址才能满足跳转条件。执行寄存器和堆栈转储以查看 ESP 此时的位置。到那时,只需相应地调整您的偏移量即可。

希望这有帮助

关于c - 汇编中的 lea 运算符使用寄存器的三参数算术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35616517/

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