开源一个ShellCode生成框架
文章目錄
- 前言
- 項目預覽
- 項目配置
- 文件命名與作用
- ShellCode大小的計算方法
- 第一部分 ShellCode生成
- 第二部分 ShellCode部分
- ShellCode加載器
- 如何提取ShellCode
- 如何擴展ShellCode框架?
- 參考資料
- 項目下載
前言
現階段,shellcode編寫門檻高,大多需要有較深的匯編功底,而Metersploit上的Shellcode開源生成框架,功能單一,擴展性差,大多只能在demo中測試使用,難以在實戰中發揮作用。
我的這個版本用純C語言實現了Windows平臺下自己的Shellcode生成器,能在實戰中根據現實情況,自動生成所需功能的Shellcode。
項目預覽
整個項目大致如下:后面會講解每一個文件的作用
項目配置
首先來說一下自己的這個項目的設置,本項目使用VS2013編譯
文件命名與作用
我的這個框架分為兩個部分,一個是ShellCode的生成部分,還有一個是ShellCode部分
之所以采用這樣的文件命名的方式是為了方便計算ShellCoede的大小。文件的編譯順序就是編譯后的exe函數的排列順序。具體來說這個項目的文件編譯順序是0.entry.cpp->a.start.cpp->b.work.cpp->z.end.cpp(main.cpp是另外一個工程),那么代碼段中的函數排列順序也會和文件的編譯順序一致 下面說一下每個文件的作用
- api.h->存放所有和api函數相關的結構體及函數指針
- hash.h->存放需要用到的API函數的哈希定義宏
- header.h->存放頭文件及函數聲明
- 0.entry.cpp->存放ShellCode函數的入口
- a.start.cpp->存放ShellCodeStart(標記一個起始位置)和真正的ShellCode代碼
- b.work.cpp->存放ShellCode中的起作用的代碼
- z.end.cpp->存放ShellCodeEnd函數(標記一個結束位置)
ShellCode大小的計算方法
首先我在a.start.cpp中放了一個ShellCodeStart函數,用于標記ShellCode的開始位置
然后在z.end中放了一個ShellCodeEnd函數,用來標記ShellCode的結束位置,然后將真正的ShellCode放在a和z之間
那么根據文件的編譯順序,只需要用ShellCodeEnd函數的位置減去ShellCodeStart函數的位置,就能得到ShellCode的大小
第一部分 ShellCode生成
首先來說明ShellCode的生成部分,這個部分在0.entry.cpp中,同時將入口點修改為EntryMain,也就是說這是整個工程的main函數
這個ShellCode生成函數會計算ShellCode的大小,然后將ShellCode寫到一個二進制文件,可以省去在OD中提取ShellCode的步驟
第二部分 ShellCode部分
真正的ShellCode代碼存放在a.start中的ShellCodeEntry函數里
首先我定義了一個結構體Functions,這個結構體存放所有需要用到的函數指針
接著通過計算哈希的方式獲取到需要的函數地址并將所需要的模塊加載進來
接著調用MessageBox函數
ShellCode加載器
另外我還寫了一個ShellCodeLoader用于測試寫好的ShellCode,代碼相對來說比較簡單
就是將ShellCode讀取到內存然后執行
如果你所編寫的ShellCode沒有文件,當雙擊ShellCodeLoader時,就會執行生成的ShellCode.bin文件
如果執行成功,說明ShellCode沒有問題
如何提取ShellCode
在編寫好ShellCode之后點擊ShellCodeFrame.exe會生成ShellCode.bin,然后用二進制文件打開ShellCode.bin,復制所有代碼即可
如何擴展ShellCode框架?
我的這個框架并只寫了一個示例的MessageBox函數,具體擴展的步驟如下:
參考資料
《Windows平臺高效Shellcode編程技術實戰》
PIC_BINDSHELL(Github):
https://github.com/mattifestation/PIC_Bindshell
項目下載
https://github.com/TonyChen56/ShellCodeFrame
總結
以上是生活随笔為你收集整理的开源一个ShellCode生成框架的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 160个Crackme044
- 下一篇: 160个Crackme045