作者:
P3nro5e
·
2014/12/08 11:32
0x00 介紹與工具安裝
在這個站點中的這套教程目的在於利用匯編程式碼來生成自己的shellcode,它將有希望地被包含在"Project Shellcode Development Framework"(shellcode 開發框架專案)中Windows shellcode和linux shellcode 的不同點是什麼?
這個教程的一些內容是以在http://www.vividmachines.com/shellcode/shellcode.html中被抽出的資訊為基礎而講述的.
Linux,不像windows那樣,它提供了一個透過int 0x80介面來與核心直接相結合的方法.可以在http://www.informatik.htw-dresden.de/~beck/ASM/syscall_list.html中找到完整的linux系統呼叫表。在另一方面,windows沒有一個直接的核心介面。系統必須透過載入函式地址來相結合,它需要從一個動態連結庫中被執行。兩種系統的關鍵不同點事實上在於windows中的函式地址在一個系統版本和另一個系統版本中的變化,因為int 0x80系統呼叫號是恆定的。Windows程式設計師這樣做以致於他們可以不會為了任何核心需要的改變而爭論。Linux相反,已經固定了所有核心級函式的計算系統,並且如果他們要改變,將會有無數憤怒的程式設計師(和大量的不完善的程式碼)
地址:http://www.vividmachines.com/shellcode/shellcode.html
所以,windows呢?我怎樣找到我需要的dll的函式地址呢?這些地址不會隨著每個服務包的升級而變化麼?
有許多方法可以找出需要使用於shellcode中的函式地址。
這裡給出了兩種尋找函式地址的方法:你可以在執行時上找需要的函式或使用硬編碼的地址。這個教程將多數討論硬編碼的方法。被對映進shellcode地址空間的dll是kernel32.dll。這個dll含有LoadLibrary 和 GetProcAddress函式,這兩個函式被用於獲取任意被對映進exploits程式空間中的函式地址。這種方法伴隨著一個問題,地址偏移將會隨著每個windows的新版本而改變(服務包,補丁等等)。所以,你使用這種方法生成的shellcode將僅僅對某個windows的特定版本有效。
動態查詢函式地址的方法將會出現在之後的教程中
集中於對windows彙編的討論;然而在開發shellcode方面,linux相當方便。因為這個原因,我發現用cygwin可以搭建一個不錯的開發shellcode的平臺。同時也可以訪問windows Dlls,下載地址:http://www.projectshellcode.com/downloads/cygwin_setup.exe 在Cygwin安裝期間,會讓你選擇你想要的安裝包
以下包便於生成shellcode:
- Devel->binutils (包含 ld, as, objdump)
- Devel->gcc
- Devel->make
- Devel->nasm
- Devel->gdb
- Editors->hexedit
- Editors->vim
- Net->netcat
- System->util-linux
已經搭建了cygwin環境,就下載下面的工具吧。一些是我自己用來使處理事情變得更容易的指令碼,和另外兩個額外的資源,你將想要把他們存放到你的cygwin環境中,例如把他們複製進C:\cygwin\home\Administrator\shellcode\中。Administrator是你的使用者名稱,同時我已經建立了一個shellcode目錄作為我們的工作站。
透過解析xxd的輸出來提取未經修改的shellcode
http://www.projectshellcode.com/downloads/xxd-shellcode.sh
自動化編譯彙編程式碼,提取未經修改的shellcode,生成unicode編碼版的未經修改的shellcode ,把你已經編碼的shellcode注入到"Template Exploit" (ms07-004) 來測試,建立一個含有你的shellcode的c測試程式,同時編譯他們準備執行!非常方便!
下載地址: http://www.projectshellcode.com/downloads/shellcode-compiler.sh或http://www.projectshellcode.com/downloads/shellcode-compiler.zip
http://www.projectshellcode.com/downloads/findFunctionInDLL.sh
在你的系統上找到包含一個特定windows函式的dll
Win32 dll 地址解析程式
http://www.vividmachines.com/shellcode/arwin.c
http://www.vividmachines.com/shellcode/shellcodetest.c
從開始選單中執行一個bash shell並cd到你的“shellcode”目錄,例如 cd /home/Administrator/shellcode/.透過使用下面的命令編譯arwin.c
gcc -o arwin arwin.c
透過輸入./arwin列出幫助.
暫時不需要編譯shellcodetest.c。把生成的shellcode放入shellcodetest.c並編譯它。同時可以透過執行shellcodetest來執行我們的shellcode.
Metasploit 框架是一個極好的生成shellcode的資源.在寫這篇文章時,Metasploit團隊即將發行Framework 3.3,它將執行在Windows上的一個cygwin環境中,開發版可以透過下面的連結來下載
- Metasploit Framework 3.3-dev
http://www.projectshellcode.com/downloads/framework-3.3-dev.exe
這個版本的框架安裝在c:\msf3\中,並有它自己專用的cygwin環境。你可以透過shell.bat執行一個shell。
這些極好的windows程式也將使用於教程4中,需要下載如下工具:
- OllyDbg 1.10 (極好的Windows偵錯程式)
下載地址: http://www.projectshellcode.com/downloads/odbg110.zip
- lcc-win32 (免費的windows c 編譯器)
下載地址:http://www.projectshellcode.com/downloads/lccwin32.exe)
生成你第一個簡單的shellcode程式吧
0x01 一段簡明的shellcode
這個教程教你shellcoding的基礎,包括
在windows DLLs中定位函式地址;
簡單的彙編;
編譯ASM程式碼的方法;
執行你的shellcode(如果它生效了)來明白其實現原理的方法.
下面我們將會生成最簡明的shellcode程式碼(只是簡單的睡眠5秒後退出).
這個教程的一些內容是基於http://www.vividmachines.com/shellcode/shellcode.html中被摘取出的資訊而講述的.
在windows DLLs中找到函式地址的方法
命名為”Sleep“的函式是睡眠的windows 函式,所以需要知道利用這個函式可以做些什麼?在彙編中,我們使用call” 0xXXXXXXX”指令,XXXXXXXX是在記憶體中的函式地址.因此需要找到這個函式被載入的地址.
這可以使用在第一個教程中已經下載並編譯好的”arwin”程式來完成.如果從建立好的shellcode目錄中執行./arwin.exe,你將看到如下使用方法的資訊:
$ ./arwin.exe
arwin - win32 address resolution program - by steve hanna - v.01
./arwin