Shellcode攻擊實驗
//csdn博客目前暫時不再更新了,有興趣請訪問我的技術博客-曉的博客:zhangxiaolong.org
首先,先要知道什麼是shellcode,Shellcode實際是一段代碼(也可以是填充數據),是用來發送到服務器利用特定漏洞的代碼,一般可以獲取權限。詳見維基百科shellcode介紹:https://en.wikipedia.org/wiki/Shellcode。
今天,先從一個簡單的漏洞程序入手分析進行shellcode攻擊。看一個程序vulp.c
#include <stdio.h> #include <string.h> int main(int argc, char **argv) { char buf[1024]; strncpy(buf, argv[1], sizeof(buf) - 1); printf(buf); exit(0); }
我們的目的是在程序執行到exit()時,通過更改exit的內存地址中的內容,把shellcode的地址作為內容寫入到該地址。
(1)編譯vulp.c程序,並且設置為suid權限。如圖1所示。
圖1
(2)編寫一個shellcode代碼(一般可以在網上找到,並做小修改就可以了),並定義一個環境變量EGG,在變量中存放shellcode;編寫一個get()函數,目的是獲取這個變量的地址。如圖2示。所獲取的地址為0xbffff838.
get()函數作用是返回變量EGG在內存中的地址。函數內容為:
#include<stdio.h> int main() { printf("%p\n",getenv("EGG")); exit(0); }
圖2
(3)尋找exit函數的地址,用objdump –R vulp命令,尋找exit的地址,如圖3示.
圖 3
(4)為了在exit函數位置內寫入地址,首先要計算在此位置要寫入的字符數,如圖4所示。Exit在第八個位置上。
圖 4
(5)有以上內容知,用vulp函數在exit地址內寫入如下圖5示的內容,其中在0x0804a010的低地址寫入0xf839,在高地址位寫入0xbfff。(計算方法在圖中已表明)
圖 5
接下來在運行vulp的程序中,執行到exit時,不進行退出,而轉向執行shellcode代碼,運行得到root權限。如圖6所示。(運行後可能結果與圖片顯示不一樣,此圖是為了更好的顯示效果,所以所有的填充都用0)
圖 6
最後更新:2017-04-02 06:52:01