软件漏洞-ShellCode瘦身

软件漏洞-ShellCode瘦身

瘦身前提

在很多攻击环境下,对于我们的Shellcode的大小是有严格限制的,我们实现一个MessageBoxA弹出

使用了很多字符串,导致ShellCode非常的大

LoadLibraryA

GetProcAddress

user32.dll

MessageBoxA

Sna1lGo

仅仅一个弹出就加入了几十个字节所以需要瘦身

利用hash来进行字符串比对

使用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
}
}

 

软件漏洞-ShellCode瘦身

上一篇:C++ 11 的一些新特性


下一篇:mac系统yarn使用报错:ERROR: add is not COMMAND nor fully qualified CLASSNAME.