Shellcode 開發關鍵技術
1. 位置程式碼無關性技術
定義:位置無關程式碼(PIC)是指不適用硬編碼地址來定址指令或資料的程式碼。
必要性:因為Shellcode被載入到記憶體地址執行時,指令的記憶體地址是不確定的。
2.如何獲取Shellcode起始位置
Shellcode在以位置無關方式訪問時,首先需要引用一個 基址指標,用該基址指標加上或減去一定的偏移,從而順利 的訪問shellcode中包含的資料。
Shellcode在以位置無關的方式訪問指令和資料時,通常是通過基址地址加上偏移的方式來實現,該基址地址通常是shellcode的起始地址。
獲取到該起始位置後,需要將其寫入到一個通用暫存器中,作為後續基址指標來使用。
方法:
(1) call/ pop 指令
Shellcode可以通過在一個call指令後立即執行 pop指令,將上一刻壓入棧中的指令地址載入到 暫存器中,從而獲取到shellcode起始的記憶體地 址。
(2)Fnstenv指令
1.X87浮點單位(FPU)在普通x86架構中提供了一 個隔離的執行環境。它包含一個單獨的專用暫存器 集合,當一個程序在使用FPU執行浮點運算時,這 些暫存器需要由作業系統在上下文切換時進行儲存
2.和fnstenv指令使用的28位元組結構體 FpuSaveState,這個結構體在32位保護模式中執 行時被用來儲存FPU狀態到記憶體中
3.手動符號解析
定義:即獲取shellcode中想要執行的函式記憶體地址
為了確保shellcode在不同的環境下均能可靠地工作, shellcode大多使用kernel32.dll中的LoadLibraryA 和GetProcAddress兩個函式來進行函式解析。
LoadLibraryA函式載入指定的庫到記憶體,並返回一個 控制代碼;GetProcAddress函式在庫的匯出表中查詢給定 符號名或序號。
4.空雪橇指令
在shellcode之前一段很長的指令序列,其並不是shellcode正常功能必需的,但是被包括在漏洞利用中,以增加漏洞利用成功的可能性。
shellcode編寫者可以通過在shellcode錢插入一大段空指令雪橇實現這一點,只要程式碼執行到這個空指令雪橇中的某處。shellcode的功能就會得以執行。
5.壞字元
如果shellcode中包含某些字元後便不能成功執行, 則稱該字元為壞字元。
導致shellcode不能正常執行的原因:
(1)第一類是該字元截斷了後續輸入,使shellcode未能完整的 裝載進記憶體,該情況下壞字元的產生是由輸入函式本身決定 的
(2)第二類是該字元在程式碼解析過程中,被替換成其他字元或者 被自動忽略,導致被當做彙編程式碼執行時語義發生改變,該 情況下壞字元的產生是由程式處理邏輯決定的
規避壞字元:
(1)利用工具:Msfvenom -b 引數
新增編碼頭
(2)Windbg的mona外掛中,compare功能幫助我們迅速定位壞字元
6. Shellcode編碼技術(繞殺軟)
Shellcode常用繞殺軟技術:大多隻能繞過靜態檢查,對於動態檢測效果不佳
(1)調換指令塊執行順序
(2)選擇不同的暫存器
(3)插入無關語句,進行混淆
(4)相同予以的不同表達
(5)Shellcode編碼
7.相關工具介紹
(1)Pwntools-shellcraft
在Linux系統下可以使用pwntools加速漏洞利用指令碼的開發過程。該模組可以生成不同指令架構下不同功能的shellcode。
(2)Msfvenom
Msfvenom是Metasploit工具箱中的一款工具,通過它能夠產生不同平臺架構、不同作業系統、不同功能的shellcode;