閱讀755 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

  上一篇:go 《Java 本地接口規範》- 調用 API
  下一篇:go API Demos 2.3 學習筆記 (15)-- Views-&gt;Radio Group