日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

淺入淺出Liunx Shellcode

/*――――――――――――-
Author:旋木木【B.C.T】[xuanmumu@gmail.com]
Date:2008/05/12
Website:www.bugshower.org
――――――――――――*/

一:什么是shellcode
話說某天某愛國安全編譯了一個(gè)Nday溢出利用程序來攻擊CNN,輸入IP并且enter之后發(fā)現(xiàn)目標(biāo)服務(wù)器沒有反應(yīng),于是拿出sniffer抓包分析… “Oh ,my dog!居然沒有帶shellcode!”為什么 shellcode對(duì)于一個(gè)exploit來說這么重要呢?Shellcode到底是什么東西呢?
簡(jiǎn)單的說,Shellcode是一段能夠完成某種特定功能的二進(jìn)制代碼 。具體完成什么任務(wù)是由攻擊者決定的,可能是開啟一個(gè)新的shell或者下載某個(gè)特定的程序也或者向攻擊者返回一個(gè)shell等等 。
因?yàn)閟hellcode將會(huì)直接操作寄存器和一些系統(tǒng)調(diào)用,所以對(duì)于shellcode的編寫基本上是用高級(jí)語言編寫一段程序然后編譯,反匯編從而得到16進(jìn)制的操作碼,當(dāng)然也可以直接寫匯編然后從二進(jìn)制文件中提取出16進(jìn)制的操作碼 。
接下來就一起來解開shellcode的神秘面紗吧~

二:Linux系統(tǒng)調(diào)用
為什么編寫shellcode需要了解系統(tǒng)調(diào)用呢?因?yàn)橄到y(tǒng)調(diào)用是用戶態(tài)和內(nèi)核態(tài)之間的一座橋梁 。大多數(shù)操作系統(tǒng)都提供了很多應(yīng)用程序可以訪問到的核心函數(shù),shellcode當(dāng)然也需要調(diào)用這些核心函數(shù) 。Linux系統(tǒng)提供的核心函數(shù)可以方便的實(shí)現(xiàn)用來訪問文件,執(zhí)行命令,網(wǎng)絡(luò)通信等等功能 。這些函數(shù)就被成為系統(tǒng)調(diào)用(System Call) 。
想知道系統(tǒng)上到底有哪些系統(tǒng)調(diào)用可以用,直接查看內(nèi)核代碼即可得到 。Linux的系統(tǒng)調(diào)用在以下文件中定義:/usr/include/asm-i386 /unistd.h,該文件包含了系統(tǒng)中每個(gè)可用的系統(tǒng)調(diào)用的定義,內(nèi)容大概如下:
#ifndef _ASM_I386_UNISTD_H_
#define _ASM_I386_UNISTD_H_

/*
* This file contains the system call numbers.
*/

#define __NR_restart_syscall 0
#define __NR_exit 1
#define __NR_fork 2
#define __NR_read 3
#define __NR_write 4
#define __NR_open 5
#define __NR_close 6
#define __NR_waitpid 7
#define __NR_creat 8
#define __NR_link 9
#define __NR_unlink 10
#define __NR_execve 11
#define __NR_chdir 12
#define __NR_time 13
#define __NR_mknod 14
#define __NR_chmod 15
.
.
.
.
每個(gè)系統(tǒng)調(diào)用都有一個(gè)名稱和相對(duì)應(yīng)的系統(tǒng)調(diào)用號(hào)組成,由于該文件很長(zhǎng)就不一一列出了 。知道了linux系統(tǒng)調(diào)用是什么樣子,下面就來了解下如何使用這些系統(tǒng)調(diào)用 。啟動(dòng)一個(gè)系統(tǒng)調(diào)用需要使用int指令,linux系統(tǒng)調(diào)用位于中斷0×80 。當(dāng)執(zhí)行一個(gè)int 0×80指令后,發(fā)出一個(gè)軟中斷,強(qiáng)制內(nèi)核停止當(dāng)前工作來處理中斷 。內(nèi)核首先檢查傳入?yún)?shù)的正確性,然后將下面寄存器的值復(fù)制到內(nèi)核的內(nèi)存空間,接下來參照中斷描述符表(IDT)來處理中斷 。系統(tǒng)調(diào)用完成以后,繼續(xù)執(zhí)行int指令后的下一條指令 。
系統(tǒng)調(diào)用號(hào)是確定一個(gè)系統(tǒng)調(diào)用的關(guān)鍵數(shù)字,在執(zhí)行int指令之前,它應(yīng)當(dāng)被傳入EAX寄存器中,確定了一個(gè)系統(tǒng)調(diào)用號(hào)之后就要考慮給該系統(tǒng)調(diào)用傳遞什么參數(shù)來完成什么樣的功能 。存放參數(shù)的寄存器有5個(gè),他們是EBX,ECX,EDX,ESI和EDI,這五個(gè)寄存器順序的存放傳入的系統(tǒng)調(diào)用參數(shù) 。需要超過6 個(gè)輸入?yún)?shù)的系統(tǒng)調(diào)用使用不同的方法把參數(shù)傳遞給系統(tǒng)調(diào)用 。EBX寄存器用于保護(hù)指向輸入?yún)?shù)的內(nèi)存位置的指針,輸入?yún)?shù)按照連續(xù)的順序存儲(chǔ) 。系統(tǒng)調(diào)用使用這個(gè)指針訪問內(nèi)存位置以便讀取參數(shù) 。
為了更好的說明一個(gè)系統(tǒng)調(diào)用的使用全過程,我們來看一個(gè)例子,這個(gè)例子中調(diào)用了write系統(tǒng)調(diào)用來將hello,syscall寫入到終端,并最終調(diào)用exit系統(tǒng)調(diào)用安全退出 。
代碼如下:
.section .data
output:
.ascii “hello,syscall!!!!/n”
output_end:
.equ len,output_end - output
.section .text

推薦閱讀