短shellcode编写指南
本文最后更新于:2023年12月29日 下午
本文shellcode完全代表amd64/intel/little endian的汇编指令。
shellcode不过就是一段+x的string。
xor还是mov?eax还是rax?
xor rax, rax
对应的16进制字符为\x48\x31\xc0
,mov rax, 0
对应的16进制字符为\x48\xc7\xc0\x00\x00\x00\x00
,mov eax, 0
对应的16进制字符为\xb8\x00\x00\x00\x00
,xor eax, eax
对应的16进制字符为\x31\xc0
。
mov al, 0
和mov ah, 0
是不能置空寄存器的。
可以看到其中最短的是xor eax, eax
,该条指令的效果也成功地将rax寄存器置空;最长的是mov rax, 0
;并且每种置空方法,xor都要比直接mov为0更短,原因在于数字需要在命令中完全地表示;使用eax的都要比使用rax的要更短,原因在于amd64的设计理念基于x86,rax类似于取了一个QWORD eax,占用字节更大自然就会导致使用字节数更多。
但是需要注意,当rsp对应位置的值为0时,使用pop rax
是最短的,对应的16进制为\x58
。
mov
首先我们应该知道mov是汇编里的助记符,而不是二进制里真正的opcode域,不同语境下的mov(如寄存器之间数据传输方向不同)采用的操作码数值也不同,详细可查询intel得指令手册(可以在intel官网下载)。
短shellcode编写指南
http://example.com/2023/12/29/短shellcode编写指南/