首页
论坛
课程
招聘
[原创]开源一个基于C++的shellcode框架
2021-7-29 18:00 6020

[原创]开源一个基于C++的shellcode框架

2021-7-29 18:00
6020

前言

最近工作中要经常编写shellcode,纯手工汇编编写shellcode太麻烦,又没有找到一个比较灵活的shellcode生成器框架,因此便有自己动手写了一个简单的基于C++的框架。已经使用了一段时间并没有发现什么问题,现在将代码开源。

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SC_MAIN_BEGIN()
{
    // *** Place function declaration here! ***
    UINT MyFunc(VOID);
 
    SC_IMPORT_API_BATCH_BEGIN();
    SC_IMPORT_API_BATCH("User32.dll", MessageBoxA);
    SC_IMPORT_API_BATCH("User32.dll", MessageBoxW);
    SC_IMPORT_API_BATCH("Kernel32.dll", ExitProcess);
    SC_IMPORT_API_BATCH_END();
 
    // *** Place code here! ***
    MessageBoxA(NULL, SC_PISTRINGA("Hello Ansi!"), SC_PISTRINGA("Hello!"), MB_OK);
    MessageBoxW(NULL, SC_PISTRINGW(L"Hello Unicode!"), SC_PISTRINGW(L"Hello!"), MB_OK);
 
    ExitProcess(MyFunc());
}
 
// *** Place function definition here! ***
SC_NOINLINE UINT MyFunc(VOID) { return 0; }
 
SC_MAIN_END()

上述代码的主要功能是调用两次MessageBox(一次用的是Ansi版本一次是Unicode版本)然后调用ExitProcess结束进程。可以看出来,使用该C++框架编写shellcode基本上除了前面的导入API代码后续代码就与常规C++没有区别了。考虑到从PE文件中手动提取shellcode也挺麻烦,因此增加了一个提取shellcode的python脚本,添加到了vs中的Post-Build Event中(代码仓库中的src目录下有配置好的vs2019项目),在编译成功后可自动提取shellcode到编译目录下(*.sh)。

编译环境

由于MSVC没有关闭SSE指令集的编译选项(使用SSE指令集会导致长字符串被存储到只读区段,然后在通过SSE指令集拷贝到栈中,如果有大佬知道怎么关闭SSE指令集希望一个指点一下),因此只能使用Clang编译器,所幸vs2019可以一键安装Clang编译器,还是比较方便的。有几个比较重要的编译选项一定要改,其余的看个人喜好,暂时未发现对生成的代码有较大影响:

  • /MT(d) /GS- /Gs1048576 -mno-sse
  • /O1(比O2生成的代码要小) /O2(RELEASE模式默认开启)

已知问题

  • 由于关闭了SSE指令集,导致无法进行浮点数运算。
  • 可以调用函数(如代码中的MyFunc),但是无法获取函数指针。 已修复,见210731更新

获取代码

下载代码

更新210731

上一个版本中提到说到无法获取函数指针,后来想了一个方案:提取shellcode时根据重定位表将函数的VA修改成基于当前EIP的偏移,使用时通过以下代码获取。

1
2
3
CALL $+5
POP  EAX
LEA  EAX, [EAX+Foo] ; Foo是需要作回调的函数,编译后会在重定位表中看到这条重定位信息,然后我们在提取shellcode时根据重定位记录修改成偏移即可。

后来想了一下觉得这种方案还要借助于提取脚本来做,而且不方便直接调试,因此退而求其次,换了一种方法:在shellcode开始动态获取SCMain函数的SCMainVA(SCMain函数的虚拟地址),然后需要用函数指针时计算一下即可获取到(Foo-SCMain+SCMainVA),但缺点是只能在SCMain函数中获取函数的指针(一般情况也足够用了)。详细代码可见更新,使用函数指针的代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
SC_MAIN_BEGIN()
{
    // *** Place function declaration here! ***
    UINT WINAPI WorkerThread(PCSTR lpAnsiMsg);
 
    SC_IMPORT_API_BATCH_BEGIN();
    SC_IMPORT_API_BATCH("Kernel32.dll", CreateThread);
    SC_IMPORT_API_BATCH("Kernel32.dll", WaitForSingleObject);
    SC_IMPORT_API_BATCH("Kernel32.dll", ExitProcess);
    SC_IMPORT_API_BATCH_END();
 
    // *** Place code here! ***
    HANDLE hWorker = CreateThread(
        NULL,
        0,
        (PTHREAD_START_ROUTINE)SC_PIFUNCTION(WorkerThread),
        SC_PISTRINGA("Hello Ansi!"),
        0,
        NULL);
    WaitForSingleObject(hWorker, INFINITE);
 
    ExitProcess(0);
}
 
// *** Place function definition here! ***
SC_NOINLINE UINT WINAPI WorkerThread(PCSTR lpAnsiMsg) {
    SC_IMPORT_API_BATCH_BEGIN();
    SC_IMPORT_API_BATCH("User32.dll", MessageBoxA);
    SC_IMPORT_API_BATCH("User32.dll", MessageBoxW);
    SC_IMPORT_API_BATCH_END();
 
    MessageBoxA(NULL, lpAnsiMsg, SC_PISTRINGA("Hello!"), MB_OK);
    MessageBoxW(NULL, SC_PISTRINGW(L"Hello Unicode!"), SC_PISTRINGW(L"Hello!"), MB_OK);
 
    return 0;
}
 
SC_MAIN_END()

[培训] 优秀毕业生寄语:恭喜id咸鱼炒白菜拿到远超3W月薪的offer,《安卓高级研修班》火热招生!!!

最后于 2021-7-30 14:25 被windpiaoxue编辑 ,原因: 更新版本
收藏
点赞5
打赏
分享
最新回复 (9)
雪    币: 7199
活跃值: 活跃值 (5572)
能力值: (RANK:530 )
在线值:
发帖
回帖
粉丝
r0Cat 活跃值 6 2021-7-29 21:40
2
0
支持开源~楼主666~
雪    币: 7952
活跃值: 活跃值 (6943)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
pureGavin 活跃值 2 2021-7-29 23:24
3
1
MSF:终究是错付了
雪    币: 342
活跃值: 活跃值 (625)
能力值: ( LV5,RANK:68 )
在线值:
发帖
回帖
粉丝
万剑归宗 活跃值 1 2021-7-30 10:17
4
0
已知问题
由于关闭了SSE指令集,导致无法进行浮点数运算。
可以调用函数(如代码中的MyFunc),但是无法获取函数指针。

那么设置回调,创建线程 就无法使用了吗?
雪    币: 5611
活跃值: 活跃值 (1502)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
v0id_ 活跃值 2021-7-30 10:46
5
0
mark
雪    币: 96
活跃值: 活跃值 (263)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
windpiaoxue 活跃值 2021-7-30 10:48
6
0
万剑归宗 已知问题 由于关闭了SSE指令集,导致无法进行浮点数运算。 可以调用函数(如代码中的MyFunc),但是无法获取函数指针。 那么设置回调,创建线程 就无法使用了吗?
x64下没问题,x86下目前有一个思路准备试试,如果可以用的话会更新上去。
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
git_12977huolongguo10 活跃值 2021-7-30 12:00
7
0
帮我改改火绒论坛上那个烂尾帖子呗
雪    币: 96
活跃值: 活跃值 (263)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
windpiaoxue 活跃值 2021-8-2 11:24
8
0
已更新,支持动态获取函数指针
雪    币: 229
活跃值: 活跃值 (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
换个刀锋 活跃值 2021-8-2 17:28
9
0
mark
雪    币: 25
活跃值: 活跃值 (209)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
快乐的小跳蛙 活跃值 2021-8-3 01:02
10
0
关闭sse  把o1改成od就可以了
游客
登录 | 注册 方可回帖
返回