一键生成windows x86 shellcode的python脚本
演示生成的shellcode代码功能为创建regedit进程,向regedit进程远程线程注入添加自启动注册表项完成持久化功能。
演示内容:shellcode使用CS的BOF提供的BeaconPrintf输出函数,显示与被注入的regedit进程通信的注册表操作结果
本项目主要想解决手动编写shellcode的过程中痛点问题(全局变量、重定位、Windows API调用等),帮助用户使用C语言实现的方法一键转换成shellcode。
优点:
- 使用简单方便,对于shellcode编写不熟练的用户,使用它可以大大提高效率
- 大胆使用全局变量和系统API,再也不用担心地址重定位问题
- 不局限于MSF和CS提供shellcode模板、随意发挥
- 支持CS提供的BOF技术内置函数使用
- 支持嵌套使用shellcode
不足:
- 暂不支持x64的shellcode生成。
- 对于有些C标准库函数处理不了,比如strtok函数。
- 生成的shellcode长度会比手动编写的长不少,但相对于ReflectiveLoader反射加载的长度小很多。
- 项目目前仅支持生成x86的shellcode
- 需要安装IDA软件并支持运行python脚本
- 使用VS编译项目时需要禁用优化并把代码生成设置为多线程/MT
- 能使用Windows API和C标准库函数完成功能时,优先使用Windows API,可以减少大量系统依赖。比如exit和ExitProcess可以实现结束进程,优先使用ExitProcess方法。
- 打开VS项目,在Shellcode_Generator_Demo.c文件中的strat函数处添加需要生成的shellcode代码,编译项目
- 使用IDA打开编译好的程序,一路默认选项,可参考演示实例
- 在IDA中找到main函数,光标选中main函数内任意地址
- 按下快捷键ALT+F7,选择项目中ida_shellcode_generator.py脚本
- 运行结束后会生成一个shellcode文件路径和大小,可以生成raw或txt格式(需要修改脚本中的outType)
- 可以使用Shellcode_Generator_Demo.c中的testShellcodeRun方法测试shellcode是否可用
-
引入Shellcode_Generator_Demo项目中的beacon.h和beacon.c文件
-
在代码中使用函数指针调用内置函数,不要直接调用BeaconPrintf,因为我们需要生成FF 15的CALL指令,类似导出函数,在后续直接替换函数地址即可,不用担心偏移问题。
-
编译项目,使用ida_shellcode_generator.py输出shellcode内容和长度
-
运行ShellCode2BOF项目中ShellCode2BOF程序,这里需要配置cl.exe编译器所需要的环境变量。运行结束后会在当前目录生成BOF.obj文件,可以用CS的inline-execute命令执行
- 同时输出raw和txt文件
- 添加push offset StartAddress标识识别
- 添加switch结构标识识别
- 支持Cobalt Strike提供的BOF技术内置函数使用
python脚本:
- 输入启动函数的地址,递归遍历所有被调用的函数写入shellcode
- 修复shellcode中函数体的调用指令的偏移操作数
- 在shellcode去除security_check相关内容(替换为nop)
- 拷贝全局变量和已初始化变量到shellcode末尾
- 构造IAT的字符串数据到shellcode末尾,替换C代码中iatInfoOffset变量值
- 构造IAT表到shellcode末尾,修复IAT表中的函数调用偏移,替换C代码中iatBeginOffset变量值
- 构造重定位表到shellcode末尾,修复重定位数据的引用偏移,替换C代码中relocBeginOffset和relocEndOffset变量值
- 输出shellcode到指定文件格式,打印输出路径和shellcode长度
C文件:
- 获取shellcode所在的基址
- 根据relocBeginOffset变量判断是否有重定位信息需要修复,有的话就根据基址和重定位表修复
- 根据iatInfoOffset变量判断是否有IAT表需要修复,不需要修复时直接跳转到用户定义的start函数
- 需要修复IAT表时,需要先通过汇编代码获取到GetProcAddress、GetModuleHandle等方法
- 根据iatInfoOffset存放的IAT的字符串信息依次修复IAT表
- 跳转到用户定义的start函数执行
- 脚本运行时报错,欢迎提交程序的IDA文件帮助定位问题,要是能提供代码源文件更好了。
- IDA程序无法运行Python脚本时,请自行google搜索相关解决方案。
该项目签署了GPL-3.0授权许可,详情请参阅Licence。
除此之外也需要遵守项目中如下的补充条款:
该项目未经作者本人允许,禁止商业使用。
任何人不得将其用于非法用途及盈利等目的,否则自行承担后果并负相应法律责任。
- 本工具仅面向拥有合法授权的渗透测试安全人员及进行常规操作的网络运维人员,用户可在取得足够合法授权且非商用的前提下进行下载、复制、传播或使用。
- 在使用本工具的过程中,您应确保自己的所有行为符合当地法律法规,且不得将此软件用于违反**人民共和国相关法律的活动。本工具所有作者和贡献者不承担用户擅自使用本工具从事任何违法活动所产生的任何责任。
请您在下载并使用本工具前,充分阅读、完全理解并接受本协议的所有条款。您的使用行为或您以其他任何方式明示或默认表示接受本协议,即视为您已阅读并同意本协议的约束。