软件漏洞-ShellCode瘦身
瘦身前提
在很多攻击环境下,对于我们的Shellcode的大小是有严格限制的,我们实现一个MessageBoxA弹出
使用了很多字符串,导致ShellCode非常的大
LoadLibraryA
GetProcAddress
user32.dll
MessageBoxA
Sna1lGo
仅仅一个弹出就加入了几十个字节所以需要瘦身
使用Hash算法对使用的字符串进行编码
DWORD getHashCode(char *strname)
{
DWORD digest = 0;
while(*strname)
{
digest = (digest<<25 | digest >>7);
digest = digest + *strname;
}
return digest
}
这里函数把字符串进行hash编码
用汇编实现编码
void _declspec(naked) asmHashCode()
{
__asm
{
push ebp
mov ebp, esp
sub esp, 0x20 //内部只有一个局部变量
push ecx
push edx
push ebx
//初始化for里面的变量
mov dword ptr[ebp - 0x4], 0//局部变量digest并赋值为0
mov eax,[ebp+0x8] //把入参的字符串首地址给eax
mov dword ptr [ebp-0x8],eax //把字符串首地址给ebp-0x8的临时变量
xor ecx,ecx //ecx存放数组的偏移地址
?
Judge_:
mov eax,dword ptr [ebp-0x8]//把数组首地址存放在eax里
xor ebx,ebx
mov bl,byte ptr [eax+ecx] //bl=*strname
test bl,bl
je End_ //如果为0就跳转
//如果不为0
mov eax,dword ptr [ebp-0x4]
mov esi,dword ptr [ebp-0x4]
shl eax,0x19//digest<<25
shr esi,0x7//digest>>7
or eax,esi
add eax,ebx //digest = digest+*strname
mov dword ptr [ebp-0x4],eax//把digest的值保存给ebp-0x4
inc ecx
jmp Judge_
End_:
mov eax,dword ptr [ebp-0x4]//把参数给eax作为返回值
pop ebx
pop edx
pop ecx
mov esp,ebp
pop ebp
ret
}
}