使用C編譯器編寫shellcode

2021-07-16 23:27:38 字數 1022 閱讀 1744

準備工作

為了確保能生成可用作shellcode這樣特定格式的**,我們需要對visual studio做些特殊的配置。下面的各項配置,可能隨編譯器的變更而變更:

1、使用release模式。近來編譯器的debug模式可能產生逆序的函式,並且會插入許多與位置相關的呼叫。

2、禁用優化。編譯器會預設優化那些沒有使用的函式,而那可能正是我們所需要的。

3、禁用棧緩衝區安全檢查(/gs)。在函式頭尾所呼叫的棧檢查函式,存在於二進位制檔案的某個特定位置,導致輸出的函式不能重定位,這對shellcode是無意義的。

第乙個shellcode

#include void shell_code()

void __declspec(naked) end_shellcode(void) {}

int main(int argc, char *argv)

這裡所示例的shellcode除了乙個無限迴圈,啥事也沒乾。不過有一點是比較重要的————放在shell_code函式之後的end_shellcode。有了這個,我們就能通過shell_code函式開頭和end_shellcode函式開頭間的距離來確定shellcode的長度了。還有,c語言在這裡所體現的好處就是我們能夠把程式本身當作一段資料來訪問,所以如果我們需要把shellcode寫到另外乙份檔案中,僅需簡單的呼叫fwrite(shell_code, sizeofshellcode, 1, filehandle)。

visual studio環境中,通過呼叫shell_code函式,借助ide的除錯技能,就可以很容易的除錯shellcode了。

在上面所示的第乙個小案例中,shellcode僅用了乙個函式,其實我們可以使用許多函式。只是所有的函式需要連續地存放在shell_code函式和end_shellcode函式之間,這是因為當在內部函式間呼叫時,call指令總是相對的。call指令的意思是「從距這裡x位元組的地方呼叫乙個函式」。所以如果我們把執行call的**和被呼叫的**都拷貝到其他地方,同時又保證了它們間的相對距離,那麼鏈結時就不會出岔子。

c 編譯器編譯過程

編譯過程 編譯過程分為四步 預處理 編譯 彙編 連線 1.預處理 預處理主要處理原始檔中的 include define 等預處理等命令 預處理主要完成的工作有 參考 程式設計師的自我修養 1 刪除 define,展開巨集 2 處理條件編譯指令。預處理程式先判斷條件,再根據條件修改源 3 刪除注釋 ...

C 編譯器大全

dev c 優點 功能簡潔 noip官方編譯器 缺點 功能並不完善 不適合商業開發 面向人群 c 初學者 dev c 現在已經更名為smart c 但noip不使用該編譯器 visual c 或visual mingw 優點 1.與windows緊密結合 2.強大的類庫支援和類改造能力 3.擁有高效...

C 編譯器優化

1 volatile 順序性 兩個包含volatile變數的指令,編譯後不可以亂序。注意是編譯後不亂序,但是在執行的過程中還是可能會亂序的,這點需要由其它機制來保證,例如memory barriers。不可優化性 volatile告訴編譯器,不要對這個變數進行各種激進的優化,甚至將變數直接消除,保證...