用Hash 算法给payload瘦身

理论基础:

  • 假设需要弹出一个MessageBox,那么至少需要使用到以下这些API或模块:
    • GetProcAddress()------>14Byte
    • LoadLibraryExA()------->14Byte
    • ExitProcess()------------->11Byte
    • User32.dll()--------------->10Byte
    • MessageBox()----------->11Byte
  • 仅仅一个简单的MessageBox就有60个与逻辑无关的字节参与进来,必须进行优化
  • 办法:通过算法变成一个32位的HASH摘要

算法设计:

需注意:通过HASH算法生成的摘要中尽可能的避免出现0x00与0x0A(会截断输入)
 

具体实现:

#include "stdafx.h"
//需注意代码的长度,中间call函数的话需要特别注意是否完整了。在OD中查看

char bShellcode[] = \
"\x83\xEC\x20\xEB\x0B\x55\x73\x65\x72\x33\x32\x2E\x64\x6C\x6C\x00\xE8\x00\x00\x00\x00\x5B" \
"\xE8\x31\x00\x00\x00\x50\x68\x87\x32\xD8\xC0\xE8\x92\x00\x00\x00\x56\x8B\xF0\x8D\x43\xF0" \
"\x6A\x00\x6A\x00\x50\xFF\xD6\x50\x68\x6A\x0A\x38\x1E\xE8\x7A\x00\x00\x00\x6A\x00\x6A\x00" \
"\x6A\x00\x6A\x00\xFF\xD0\x8B\xE5\x5D\xC3\x55\x8B\xEC\x83\xEC\x0C\x64\xA1\x30\x00\x00\x00" \
"\x8B\x40\x0C\x8B\x40\x0C\x8B\x00\x8B\x00\x3E\x8B\x40\x18\x8B\xE5\x5D\xC3\x55\x8B\xEC\x83" \
"\xEC\x04\xC7\x45\xFC\x00\x00\x00\x00\x53\x51\x52\x8B\x75\x08\x33\xC9\x33\xC0\x8A\x04\x0E" \
"\x84\xC0\x74\x16\x8B\x5D\xFC\xC1\xE3\x19\x8B\x55\xFC\xC1\xEA\x07\x0B\xDA\x03\xD8\x89\x5D" \
"\xFC\x41\xEB\xE3\x8B\x5D\x0C\x8B\x55\xFC\x33\xC0\x3B\xDA\x75\x05\xB8\x01\x00\x00\x00\x5A" \
"\x59\x5B\x8B\xE5\x5D\xC2\x08\x00\x55\x8B\xEC\x83\xEC\x0C\x52\x8B\x55\x0C\x8B\x72\x3C\x8D" \
"\x34\x32\x8B\x76\x78\x8D\x34\x32\x8B\x7E\x1C\x8D\x3C\x3A\x89\x7D\xFC\x8B\x7E\x20\x8D\x3C" \
"\x3A\x89\x7D\xF8\x8B\x7E\x24\x8D\x3C\x3A\x89\x7D\xF4\x33\xC9\xEB\x01\x41\x8B\x75\xF8\x8B" \
"\x34\x8E\x8B\x55\x0C\x8D\x34\x32\xFF\x75\x08\x56\xE8\x67\xFF\xFF\xFF\x85\xC0\x74\xE6\x8B" \
"\x75\xF4\x33\xFF\x66\x8B\x3C\x4E\x8B\x55\xFC\x8B\x34\xBA\x8B\x55\x0C\x8D\x04\x32\x5A\x8B" \
"\xE5\x5D\xC2\x08\x00";
int main()
{
    __asm
    {
        LEA EAX, bShellcode;
        PUSH EAX;
        RET;
    }
    return 0;
}

 

//**********************************************
//哈希摘要算法(取摘要)
//参数为 函数名字符串
//返回值:哈希值
//*********************************************
int Hash_GetDigest(char* strFunName)
{
    unsigned int nDigest = 0;
    while (*strFunName)
    {
        //左移25位,右移7位,按位或
        nDigest = ((nDigest << 25) | (nDigest >> 7));
        nDigest = nDigest + *strFunName;
        strFunName++;
    }
    return nDigest;
}
int hash_Loadlibrary = Hash_GetDigest("LoadLibraryExA");//0xc0d83287
int hash_MessBox = Hash_GetDigest("MessageBoxA");//0x1e380a6a

 

posted @ 2018-06-03 16:34  by_Clark  阅读(372)  评论(0编辑  收藏  举报