短shellcode编写指南

本文最后更新于:2023年12月29日 下午

本文shellcode完全代表amd64/intel/little endian的汇编指令。

shellcode不过就是一段+x的string。

xor还是mov?eax还是rax?

xor rax, rax对应的16进制字符为\x48\x31\xc0mov rax, 0对应的16进制字符为\x48\xc7\xc0\x00\x00\x00\x00mov eax, 0对应的16进制字符为\xb8\x00\x00\x00\x00xor eax, eax对应的16进制字符为\x31\xc0

mov al, 0mov 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编写指南/
作者
OSLike
发布于
2023年12月29日
许可协议