用Hash 算法给payload瘦身

Posted Clark的个人博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用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[] = "x83xECx20xEBx0Bx55x73x65x72x33x32x2Ex64x6Cx6Cx00xE8x00x00x00x00x5B" "xE8x31x00x00x00x50x68x87x32xD8xC0xE8x92x00x00x00x56x8BxF0x8Dx43xF0" "x6Ax00x6Ax00x50xFFxD6x50x68x6Ax0Ax38x1ExE8x7Ax00x00x00x6Ax00x6Ax00" "x6Ax00x6Ax00xFFxD0x8BxE5x5DxC3x55x8BxECx83xECx0Cx64xA1x30x00x00x00" "x8Bx40x0Cx8Bx40x0Cx8Bx00x8Bx00x3Ex8Bx40x18x8BxE5x5DxC3x55x8BxECx83" "xECx04xC7x45xFCx00x00x00x00x53x51x52x8Bx75x08x33xC9x33xC0x8Ax04x0E" "x84xC0x74x16x8Bx5DxFCxC1xE3x19x8Bx55xFCxC1xEAx07x0BxDAx03xD8x89x5D" "xFCx41xEBxE3x8Bx5Dx0Cx8Bx55xFCx33xC0x3BxDAx75x05xB8x01x00x00x00x5A" "x59x5Bx8BxE5x5DxC2x08x00x55x8BxECx83xECx0Cx52x8Bx55x0Cx8Bx72x3Cx8D" "x34x32x8Bx76x78x8Dx34x32x8Bx7Ex1Cx8Dx3Cx3Ax89x7DxFCx8Bx7Ex20x8Dx3C" "x3Ax89x7DxF8x8Bx7Ex24x8Dx3Cx3Ax89x7DxF4x33xC9xEBx01x41x8Bx75xF8x8B" "x34x8Ex8Bx55x0Cx8Dx34x32xFFx75x08x56xE8x67xFFxFFxFFx85xC0x74xE6x8B" "x75xF4x33xFFx66x8Bx3Cx4Ex8Bx55xFCx8Bx34xBAx8Bx55x0Cx8Dx04x32x5Ax8B" "xE5x5DxC2x08x00";
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

 

以上是关于用Hash 算法给payload瘦身的主要内容,如果未能解决你的问题,请参考以下文章

使用ImageMagick给图片瘦身

用什么方法给图片文件瘦身变小

给虚拟机里的Ubuntu瘦身

一致性哈希算法PHP测试片段

微信小程序瘦身器-协助微信小程序瘦身

如何给引入的文字文件瘦身