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...