shellcode中的空字节

时间:2013-05-14 18:36:07

标签: shellcode

通过维基百科上的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

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

2 个答案:

答案 0 :(得分:1)

空字节在第一条指令的B8 01之后。 第二条指令使用xor操作将 eax (任何x xor x = 0)清零,然后将其递增1以实现相同的结果,而不是00,< em> null byte 。

答案 1 :(得分:0)

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

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

实际上有3个空字节

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

  1. XOR和INC的操作码不包含nullbytes(http://ref.x86asm.net/coder32-abc.html
  2. 这里只使用寄存器作为参数
  3. 对于MOV EAX, 1指令,汇编程序必须编写操作码(B8)和2个参数,其中一个是32位整数。由于1是一个非常小的数字,其余的位用零填充,导致空字节。

    XORINC指令不会在代码中使用整数,也不必插入零。

    更新

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

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

    0b10111000 + 0x000 = 0b10111000 = 0xB8
    

    所以B8编码为MOV EAX, imm32

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