1. 程式人生 > >Shellcode 開發關鍵技術

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;