obj2shellcode
基于大佬lainswork开发的shellcode-factory项目(瑞斯拜),增加了一些自己的拙见,本意在于理解这一技术,后续会修复bug但可能不会继续实现额外的功能了。
项目地址
https://github.com/jseclab/obj2shellcode
项目作用
可以使用一些c++高级语法进行x64/x86 shellcode开发,自动从obj文件中提取shellcode
新增内容
在原本基础上增加了对编译x86 shellcode的支持,在开发x86 shellcode时候可以使用全局字符串(但是无法使用std::string之类的字符串容器,因为需要CRT初始化),在x64上无法使用全局字符串,因为其重定位类型为IMAGE_REL_AMD64_ADDR64,有兴趣可以自行实现。
项目文件
obj-shellcode: 解析并提取 shellcode
payload:shellcode 编写模板
run:shellcode 测试加载器
项目设置
可以直接使用payload作为模板,也可以自行添加一个静态库项目
- • 关闭JMC
- • 关闭SDL检查
- • 禁用c++异常
- • 禁用安全检查
- • 优化开到最大
- • 设置LAZY_IMPORTER_HARDENED_MODULE_CHECKS预定义宏
注意事项
- • 32位数据重定位类型为IMAGE_REL_I386_DIR32也就是绝对地址定位,但是我们并不能事先知道shellcode运行地址,所以我采用了运行时重定位的方法,也就是在调用shellcode时需要先行调用fix函数,当然如果你只有一个导出,可在函数开始位置调用fix,这将使得shellcode在运行时候自动进行重定位.
- • 上述原因也意味着shellcode运行时所属内存应当有写权限
#ifndef _WIN64
reinterpret_cast<RUNSHELLCODE>(reinterpret_cast<char*>(shell_address)+
shellcode::rva::fix)((void*)0x9999999);
#endif//
- • 另外32位默认使用cdcel调用约定,所以在调用时应定义一个如下类型指针.
typedef DWORD(*RUNSHELLCODE)(
LPVOID lpThreadParameter
);
- • 32位不能直接对数组进行初始化
byte array[0x200]={0}//这是不允许的
这样会导致汇编层面调用c库函数 _memset (开了优化依然去除不了...) ,64位不会出现这个问题在于他使用了 rep 指令.
LI_FN(memset)(array,0,sizeof(array)//可以这样
SecureZeroMemory(array,sizeof(array))//也可以这样
引用
[1]: https://github.com/lainswork/shellcode-factory
[2]: https://bbs.kanxue.com/thread-115877.htm
原文始发于微信公众号(无名之):obj2shellcode 前人不仅具有智慧,更具分享精神
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论