通过维基百科上的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
第一条指令中的空字节在哪里?转换的指令如何没有空字节?
答案 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个空字节
如何转换的指令没有空字节? 因为
对于MOV EAX, 1
指令,汇编程序必须编写操作码(B8
)和2个参数,其中一个是32位整数。由于1是一个非常小的数字,其余的位用零填充,导致空字节。
XOR
和INC
指令不会在代码中使用整数,也不必插入零。
我没有注意到MOV r32, imm32
的操作码中的+ r。
寄存器在x86中使用3位进行编码,eax为000
。
B8
是二进制0b10111000
,最后是3个空闲位。
0b10111000 + 0x000 = 0b10111000 = 0xB8
所以B8
编码为MOV EAX, imm32
。
剩下的是0x01000000
,1是小端的。