如何消除Windows Shellcode中的空字节——以mov ebx, fs:30h为例
去除
mov ebx, fs:30h Shellcode中的空字节方法 原指令mov ebx, fs:30h对应的机器码是648b1d30000000,其中包含三个连续的空字节(000000),这会导致Shellcode被字符串处理函数截断,无法正常执行。以下是几种可行的无空字节替代方案:
方案1:寄存器间接寻址(用cl构造偏移)
xor ecx, ecx ; 清空ecx寄存器 mov cl, 30h ; 将30h加载到cl(仅占用1字节,无高位空字节) mov ebx, fs:[ecx] ; 通过ecx间接访问fs段的30h地址
对应的机器码:31c9b130648b19,无空字节。
方案2:使用lea指令结合16位立即数
xor eax, eax ; 清空eax寄存器 mov ax, 30h ; 以16位立即数加载30h到ax,避免32位立即数的空字节 lea ebx, fs:[eax] ; 计算fs段中eax指向的地址并赋值给ebx
对应的机器码:31c066b83000648d18,无空字节。
方案3:加法构造偏移地址
xor edx, edx ; 清空edx寄存器 add dl, 30h ; 通过加法将30h存入dl mov ebx, fs:[edx] ; 通过edx间接访问fs段的30h地址
对应的机器码:31d280c230648b1a,无空字节。
这些方案的核心思路都是避免直接使用32位立即数30000000,转而通过寄存器构造偏移地址,从而消除机器码中的空字节。
内容的提问来源于stack exchange,提问作者R-Rothrock
相关产品推荐
相关产品推荐

