1. 程式人生 > >用Hash 算法給payload瘦身

用Hash 算法給payload瘦身

ddr san 中間 pla x64 左移 font inline pre

理論基礎:

  • 假設需要彈出一個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

用Hash 算法給payload瘦身