Shellcode技術雜談

2021-06-16 00:25:30 字數 2752 閱讀 5373

shellcode是溢位程式和蠕蟲病毒的核心,提到它自然就會和漏洞聯想在一起,畢竟shellcode只對沒有打補丁的

主機有用武之地。網路上數以萬計帶著漏洞頑強執行著的伺服器給hacker和vxer豐盛的晚餐。漏洞利用中最關鍵的是

shellcode的編寫。由於漏洞發現者在漏洞發現之初並不會給出完整shellcode,因此掌握shellcode編寫技術就顯得

尤為重要。

小弟經過一段時間的修煉,自以為對shellcode小有心得,故在這裡寫出來,博君一笑。不當之處,還請各位高人

不吝指教。

什麼是shellcode

我在這裡簡單講一下什麼是shellcode。shellcode實際是一段**(也可以是填充資料),是用來傳送到伺服器

利用特定漏洞的**,一般可以獲取許可權。另外,shellcode一般是作為資料傳送給受攻擊服務的。

shellcode編寫考慮因素

shellcode一般作為資料傳送給服務端造成溢位,不同資料對資料要求不同,因此,shellcode也不一定相同。但

shellcode在編寫過程中,有些問題是一致的:

⒈shellcode的編寫語言。

用什麼語言編寫最適合shellcode呢?這個問題沒有定論。一般採用的是c語言,速度較快,但是asm更便於控制

shellcode的生成。到底是快速編寫還是完全控制呢?很難回答呢。

⒉shellcode本身**的重定位。shellcode的流程控制,即如何通過溢位使控制權落在shellcode手中

⒊。shellcode中使用的api位址定位。

⒋shellcode編碼問題。

⒌多型技術躲避ids檢測。

現在我們就來研究這些問題在處理時常用的方法。

shellcode編寫技術

⒈shellcode編寫語言

shellcode本質上可以使用任何程式語言,但我們需要的是提取其中的機器碼。shellcode使用組合語言編寫是最

具可控性的,因為我們完全可以通過指令控制**生成,缺點就是需要大量的時間,而且還要你深入了解彙編。如果你

想追求速度,c是不錯的選擇。c語言編寫起來較為省力,但shellcode提取較為複雜,不過,一旦寫好模板,就省事許

多。例如,這裡有乙個寫好的模板:

void shellcode()

}然後在main()中用函式指標操作和memcmp定位shellcode,用pintf之類函式將shellcode打出來或儲存即可。示

例**略。縱觀當前shellcode,大部分是由c完成的,因此,想來大家已經取捨完了吧?

⒉shellcode**位址定位,獲取程式eip。

為什麼要獲取eip呢?原因是,我們需要我們的shellcode能夠執行,對病毒技術有了解的話,應該知道他們是怎麼

定位的:利用call/pop來實現。

這裡就不得不提到兩種方法:jmp esp和call/pop ebx。這是人們在對windows系統熟悉之後的方法,成功率非常

高。相信看過王煒兄的教程的朋友應該有印象吧。這裡我就簡單說一下。

我們的方法時通過shellcode位址覆蓋返回位址,在溢位後即可跳轉到我們的**中,以獲取許可權。而shellcode

在記憶體中的位址並不固定,因此我們利用系統的dll檔案中的jmp esp或call esp、call ebp來實現對shellcode位址

的間接跳轉。這樣有兩個好處,一是不必準確定位shellcode位址;二是可以防止strcpy對00位元組的截斷,因為dll文

件中,位址一般為7f******。具體細節,網上已有相關的東東,大家自己找來看看吧。

⒊shellcode中的api位址定位。

shellcode**的執行環境和病毒在某些方面是類似的,由於系統不同,api的位址也不盡相同。因此,要想讓

shellcode在不同windows下執行就必須解決api的定位問題。api定位的關鍵是了解windows dll映像檔案格式,即pe

檔案格式,然後通過搜尋函式的export表獲取api位址。定位方法有暴力搜尋法、從程序peb中獲取和遍歷seh鏈法。我

們這裡使用從程序peb中獲取,示例**如下:

__asm

//將編碼code放在decryptsc後

buff[k]=ch;

++k;

}解碼時** 解碼時**,示例如下:

jmp       next

getencodeaddr:

pop       edi

push       edi

pop        esi

xor        ecx,ecx

decrypt_lop:

loasb

cmp       al,cl

jz        shell

cmp       al,0x30      //判斷是否為特殊字元

jz        specal_char_clean

store:

xor       al,enc_key

stosb

jmp       decrypt_lop

special_char_clean:

lodsb

sub       al,0x31

jmp       store

next:

call      getencodeaddr

這裡只給了乙個簡單的例子,面對對unicode編碼有要求的,限於篇幅,這裡就不詳解了。

寫在最後

編寫除錯shellcode很是辛苦,但完成之後卻有巨大的成就感。這裡不是教你做exp去害人,只是從研究角度出發,

Shellcode技術雜談

shellcode是溢位程式和蠕蟲病毒的核心,提到它自然就會和漏洞聯想在一起,畢竟shellcode只對沒有打補丁的 主機有用武之地。網路上數以萬計帶著漏洞頑強執行著的伺服器給hacker和vxer豐盛的晚餐。漏洞利用中最關鍵的是 shellcode的編寫。由於漏洞發現者在漏洞發現之初並不會給出完整...

c 技術雜談

while scanf d n 這個while迴圈裡面的語句代表當輸入為空或者讀取到最後乙個值時停止迴圈,代表按位取反 const和指標的三種經典組合 const int p 指向常量的指標 char const p a 常指標 const char const p a 指向常量的常指標 左移 右移...

前端技術雜談

前端快取 在所有應用該js的地方加上版本號就可以了,日期也可以作為乙個版本好的作用。參考文章 json.stringify 與json.parse safari瀏覽器自帶pdf預覽,谷歌搞不了了。注意safari 和谷歌 或者火狐等瀏覽器的區別。的格式有多種,最為常見的是jpg png gif jp...