2

我正在完成 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 周围有括号 - 那么我可以看到差异,但事实并非如此,我错过了什么?

4

0 回答 0