一键生成Windows x86 shellcode的IDA Python脚本

作者:Sec-Labs | 发布时间:

项目地址

https://github.com/jxust-xiaoxiong/Shellcode_Generator

一键生成windows x86 shellcode的python脚本

📖目录

👨🏻‍💻 预览演示

演示生成的shellcode代码功能为创建regedit进程,向regedit进程远程线程注入添加自启动注册表项完成持久化功能。

 

ad1a1b7183115225

 

🔥 介绍

​ 本项目主要想解决手动编写shellcode的过程中痛点问题(全局变量重定位Windows API调用等),帮助用户使用C语言实现的方法一键转换成shellcode。

优点和不足之处

优点:

  • 使用简单方便,对于shellcode编写不熟练的用户,使用它可以大大提高效率
  • 大胆使用全局变量和系统API,再也不用担心地址重定位问题
  • 不局限于MSF和CS提供shellcode模板、随意发挥。
  • 支持嵌套使用shellcode

不足:

  • 暂不支持x64的shellcode生成。
  • 对于有些C标准库函数处理不了,比如strtok函数。
  • 生成的shellcode长度会比手动编写的长不少,但相对于ReflectiveLoader反射加载的长度小很多。

🔗 使用环境

  • 项目目前仅支持生成x86的shellcode
  • 需要安装IDA软件并支持运行python脚本
  • 使用VS编译项目时需要禁用优化并把代码生成设置为多线程/MT
  • 能使用Windows APIC标准库函数完成功能时,优先使用Windows API,可以减少大量系统依赖。比如exitExitProcess可以实现结束进程,优先使用ExitProcess方法。

💡 用法

  1. 打开VS项目,在Shellcode_Generator_Demo.c文件中的strat函数处添加需要生成的shellcode代码,编译项目

  2. 使用IDA打开编译好的程序,一路默认选项,可参考演示实例

  3. 在IDA中找到main函数,光标选中main函数内任意地址

  4. 按下快捷键ALT+F7,选择项目中ida_shellcode_generator.py脚本

  5. 运行结束后会生成一个shellcode文件路径和大小,可以生成raw或txt格式(需要修改脚本中的outType)

  6. 可以使用Shellcode_Generator_Demo.c中的testShellcodeRun方法测试shellcode是否可用

🔩 设计思路

python脚本:

  1. 输入启动函数的地址,递归遍历所有被调用的函数写入shellcode
  2. 修复shellcode中函数体的调用指令的偏移操作数
  3. 在shellcode去除security_check相关内容(替换为nop)
  4. 拷贝全局变量和已初始化变量到shellcode末尾
  5. 构造IAT的字符串数据到shellcode末尾,替换C代码中iatInfoOffset变量值
  6. 构造IAT表到shellcode末尾,修复IAT表中的函数调用偏移,替换C代码中iatBeginOffset变量值
  7. 构造重定位表到shellcode末尾,修复重定位数据的引用偏移,替换C代码中relocBeginOffset和relocEndOffset变量值
  8. 输出shellcode到指定文件格式,打印输出路径和shellcode长度

C文件:

  1. 获取shellcode所在的基址
  2. 根据relocBeginOffset变量判断是否有重定位信息需要修复,有的话就根据基址和重定位表修复
  3. 根据iatInfoOffset变量判断是否有IAT表需要修复,不需要修复时直接跳转到用户定义的start函数
  4. 需要修复IAT表时,需要先通过汇编代码获取到GetProcAddress、GetModuleHandle等方法
  5. 根据iatInfoOffset存放的IAT的字符串信息依次修复IAT表
  6. 跳转到用户定义的start函数执行
标签:工具分享, 免杀工具, shellcode生成工具, IDA PRO