用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
人的一生 是一个见天地,见众生,见自己的过程;
能享受最好的
能承受最坏的;
纵有疾风起,人生不言弃