編寫Unicode有效的Shellcode

2021-04-13 11:17:34 字數 2163 閱讀 2213

對於溢位愛好者來說,能夠編寫shellcode是乙個必備的基本技能,特別是能應對各種在實際情況中對shellcode存在各種限制條件的時候,這種 能力就顯得尤為重要了。黑防2023年第二期中介紹了純字母數字的shellcode的編寫,在3期中的winrar 7z溢位中就派上了用場。unicode大家應該不陌生,在一些大型程式中,比如word、excel考慮到不同語言平台的差異性,都會使用 unicode,在利用這些漏洞的時候,我們以往的shellcode就難以適用了。乙個普通的down&exec的shellcode經過 multibytetowidechar函式轉換成unicode後,如圖1

shellcode編寫的思路

可能有的讀者認為只要先將shellcode寫好,然後用widechartomultibyte函式轉換成ascii碼就可以了,再經過程式轉換成 unicode就可以了,但事實不是這樣的,在轉換成unicode的時候,轉換函式會根據當前使用的**頁進行轉換,比如大寫字母'a'(/x41)被 轉換成/x41/x00,但是第乙個位元組》0x80或者第二個位元組不是/x00的時候,情況就不是這麼簡單了, multibytetowidechar會查詢**頁中的對應結果,假如找不到就會有/x3f(?)代替,表示有錯誤。所以大家看到為什麼圖1中轉換後的 shellcode會出現問號。這兒我們還是採取分段編碼,如下:

|                  |

|    解碼頭部      |

-----------------------------

|    拆分編碼的    |

|    原shellcode    |

為了保護原始的shellcode,我們將原始的shellcode每個位元組都拆分成兩個位元組,高4位和低4位均加上0x61(a),由於4位只能表示0 -15,所以每個位元組都可以拆成a-p的兩個位元組,這樣就順利的躲過了編碼轉換的問題,剩下的就是構造盡量小的譯碼頭,使之轉換不出現0x3f。當然,最 理想的情況就是譯碼頭在ascii碼的情況下是純字元,這兒我介紹的譯碼頭不是純字元,在multibytetowidechar中使用不同的**頁轉換 出的結果都是不一樣的,也就是shellcode可能無法實現跨語言平台,上述的純字元譯碼頭則可以跨語言平台實現通用。

編寫例項

有了思路後就剩下編碼的問題了,分成4部分分別加以闡述

1)對原shellcode進行拆分編碼,編碼的思路已經說過,下面是編碼部分的**:

code:

//shellcode1指向待編碼的shellcode、pshellcode 是指向其的指標

//詳見encode.cpp

byte* pshellcode = shellcode1;

char high,low;

for( int i = 0 ; i < sizeof(shellcode1) - 1 ; i++,pshellcode++)

printf("%d",(sizeof(shellcode1) - 1)*2);編碼前和編碼後的shellcode分別如圖2和3所示:

例如編碼前第乙個位元組/xe9高4位和低4位分別是/xe和/x9,加上0x61後就是0x6f(o)和0x6a(j)。

2)譯碼頭的編寫,必須保證轉換成ascii後沒有出現0x3f,彙編**如下所示:

code:

__a**有幾點需要注意,保持譯碼頭為偶數個位元組,因為unicode是雙位元組碼,碰到有0x3f的情況,在不影響指令的前提下進行等價變換。如上譯碼頭被轉換成ascii的情況下為:

"/xc4/x58/xa5/xc1/xd6/x5f/xc8/x43/xa5/xc6/xd7/x50/xdb/xb1/x95/xbb"

"/x90/xe6/xea/xc0/xac/xa6/xe5/xcc/xbe/xaf/xdb/xa6/xdf/x58/xda/xf9"

"/x90/xe5/xa8/xbb/x8a/x91/xd0/xb0/xdf/x58/xae/x74/xbf/xa4/xe0/x41"

3)測試**

測試**如下,模擬了溢位發生時的情況:

code:

4.jpg 小結

shellcode也是一門學問,平時要注意這方面的學習,以免發生「shellcode到用時方很少」的尷尬局面,特別是在office系列檔案的溢位中,經常會出現編碼轉換的問題,希望能給廣大黑友帶來一點幫助,本人也是菜鳥,如有錯誤紕漏,歡迎指正。 

有效的括號(C 編寫)

題目描述 給定乙個只包括 的字串,判斷字串是否有效。有效字串需滿足 左括號必須用相同型別的右括號閉合。左括號必須以正確的順序閉合。注意空字串可被認為是有效字串。示例 1 輸入 輸出 true 示例 2 輸入 輸出 true 示例 3 輸入 輸出 false 示例 4 輸入 輸出 false 示例 5...

有效的用例編寫規則

第一章 什麼是高質量的用例 1.1 為什麼要使用用例 用例提供了一種用於構建故事的半形式框架 在每個用例和所有描述層次中,用例都描述了錯誤情況的系統需求 雖然本質上是一種功能分解技術,但用例已經成為物件導向軟體開發的乙個流行元素 用例提供了可以在其上處理其他專案資訊的骨架 專案經理根據用例進行估計和...

編寫符合ANSI和Unicode的應用程式

世界真的很奇妙,分久必合,合久必分。計算機發展到今天,多國之間的交流日益廣泛,軟體本地化是重大趨勢。如果減少本地化工作就是一件值得考慮的事情。軟體本地化要解決的真正問題就是如何來處理不同的字符集。要知道,單位元組字元是乙個8位的資料來表示的。因此,它最多能表示256個字元。全世界那麼多個國家,256...