0

通过维基百科上的shellcode文章,它给出了一个示例,如下所示:

B8 01000000    MOV EAX,1          // Set the register EAX to 0x000000001

为了使上述指令为空,他们将其重写如下:

33C0           XOR EAX,EAX        // Set the register EAX to 0x000000000
40             INC EAX            // Increase EAX to 0x00000001

第一条指令中的空字节在哪里?转换后的指令如何没有空字节?

4

2 回答 2

1

空字节就B8 01在第一条指令之后。第二条指令使用该操作将eax (any )xor清零,然后将其递增 1 以在没有空字节的情况下获得相同的结果。x xor x = 000

于 2013-05-14T18:57:32.117 回答
0

第一条指令中的空字节在哪里?

B8 01000000    MOV EAX,1          // Set the register EAX to 0x000000001
     ^^^^^^
     1 2 3

实际上有 3 个空字节

转换后的指令如何没有空字节? 因为

  1. XOR 和 INC 的操作码不包含空字节(http://ref.x86asm.net/coder32-abc.html
  2. 这里只使用寄存器作为参数吗

对于MOV EAX, 1指令,汇编器必须编写操作码 ( B8) 和 2 个参数,其中一个是 32 位整数。由于 1 是一个非常小的数字,剩余的位用零填充,从而产生一个空字节。

XORand指令在您的INC代码中不采用整数,也不必插入零。

更新

我没有注意到操作码中的 +r MOV r32, imm32

寄存器在 x86 中使用 3 位编码,eax 是000. B8是二进制0b10111000的,最后是 3 个空闲位。

0b10111000 + 0x000 = 0b10111000 = 0xB8

所以B8编码为MOV EAX, imm32.

剩下的是0x01000000, 1 是小端序。

于 2013-05-14T19:00:09.323 回答