obj2shellcode

admin 2024年6月27日19:42:19评论10 views字数 1326阅读4分25秒阅读模式

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,有兴趣可以自行实现。

obj2shellcode

obj2shellcode

项目文件

obj-shellcode: 解析并提取 shellcode

payload:shellcode 编写模板

run:shellcode 测试加载器

项目设置

可以直接使用payload作为模板,也可以自行添加一个静态库项目

  • • 关闭JMC
  • • 关闭SDL检查
  • • 禁用c++异常
  • • 禁用安全检查
  • • 优化开到最大
  • obj2shellcode

    obj2shellcode

    obj2shellcode

     

  • • 设置LAZY_IMPORTER_HARDENED_MODULE_CHECKS预定义宏
  • obj2shellcode

注意事项

  • • 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 前人不仅具有智慧,更具分享精神

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年6月27日19:42:19
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   obj2shellcodehttp://cn-sec.com/archives/2892298.html

发表评论

匿名网友 填写信息