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

淺入淺出Liunx Shellcode( 二 )


.globl _start
_start:
movl $4,陎 #define __NR_write 4
movl $1,離
movl $output,靫
movl $len,韝
int $0×80
movl $1,陎
movl $0,離
int $0×80
編譯該程序,并查看運(yùn)行結(jié)果:
pr0cess@pr0cess:~$ as -o syscall.o syscall.s
pr0cess@pr0cess:~$ ld -o syscall syscall.o
pr0cess@pr0cess:~$ ./syscall
hello,syscall!!!!
可以看到hello,syscall被寫入到終端 。那么這個(gè)過程是怎么實(shí)現(xiàn)的呢?首先程序定義了一個(gè)字符串hello,syscall!!!!和字符串的長(zhǎng)度len,接下來將write系統(tǒng)調(diào)用號(hào)寫入到eax寄存器中,接著write系統(tǒng)調(diào)用的第一個(gè)參數(shù)需要一個(gè)文件描述符fd,linux包含3種文件描述符0[STDIN]:終端設(shè)備的標(biāo)準(zhǔn)輸入;1[STDOUT]:終端設(shè)備的標(biāo)準(zhǔn)輸出;2[STDERR]:終端設(shè)備的標(biāo)準(zhǔn)錯(cuò)誤輸出 。我們這里把fd的值設(shè)置為1,就是輸入到屏幕上,因此把操作數(shù)1賦值給EBX寄存器 。write系統(tǒng)調(diào)用的第二個(gè)參數(shù)是要寫入字符串的指針,這里需要一個(gè)內(nèi)存地址,因此我們通過movl $output,靫把output指向的實(shí)際內(nèi)存地址存放在 ECX寄存器中 。write系統(tǒng)調(diào)用的第三個(gè)參數(shù)是寫入字符串的長(zhǎng)度,按照順序的參數(shù)傳遞方式,我們把len傳遞到EDX寄存器中,接著執(zhí)行int $0×80軟中斷來執(zhí)行write系統(tǒng)調(diào)用 。下一步執(zhí)行了一個(gè)exit(0) 操作,將exit系統(tǒng)調(diào)用號(hào)1傳遞給EAX寄存器,將參數(shù)0傳遞給EBX寄存器,然后執(zhí)行int $0×80來執(zhí)行系統(tǒng)調(diào)用,實(shí)現(xiàn)程序的退出 。
為了更清晰的驗(yàn)證我們的系統(tǒng)調(diào)用確實(shí)被執(zhí)行了,可以通過strace來查看二進(jìn)制代碼的運(yùn)行情況,結(jié)果如下:
pr0cess@pr0cess:~$ strace ./syscall
execve(”./syscall”, ["./syscall"], [/* 34 vars */]) = 0
write(1, “hello,syscall!!!!/n”, 18hello,syscall!!!!
) = 18
_exit(0)
通過返回的結(jié)果我們可以清楚的看到剛才syscall程序都執(zhí)行了哪些系統(tǒng)調(diào)用,以及每個(gè)系統(tǒng)調(diào)用都傳遞了什么參數(shù)進(jìn)去 。
已經(jīng)了解了系統(tǒng)調(diào)用的實(shí)現(xiàn)過程,讓我們離shellcode更進(jìn)一步吧 。

三:第一個(gè)shellcode
最初當(dāng)shellcode這個(gè)名詞來臨的時(shí)候,目的只是獲得一個(gè)新的shell,在那時(shí)已經(jīng)是一件很美妙的事情,接下來我們就來實(shí)現(xiàn)如何獲得一個(gè)新的 shell來完成我們第一個(gè)shellcode的編寫 。這里需要注意的一個(gè)基本的關(guān)鍵的地方就是在shellcode中不能出現(xiàn)/x00也就是NULL字符,當(dāng)出現(xiàn)NULL字符的時(shí)候?qū)?huì)導(dǎo)致shellcode被截?cái)?,從而無法完成其應(yīng)有的功能,這確實(shí)是一個(gè)讓人頭疼的問題 。那么有什么解決辦法呢?我們先來抽取上個(gè)例子syscall中的16進(jìn)制機(jī)器碼來看看有沒有出現(xiàn)/x00截?cái)喾?BR>pr0cess@pr0cess:~$ objdump -d ./syscall

./syscall: file format elf32-i386

Disassembly of section .text:

08048074 <_start>:
8048074: b8 04 00 00 00 mov $0×4,陎
8048079: bb 01 00 00 00 mov $0×1,離
804807e: b9 98 90 04 08 mov $0×8049098,靫
8048083: ba 12 00 00 00 mov $0×12,韝
8048088: cd 80 int $0×80
804808a: b8 01 00 00 00 mov $0×1,陎
804808f: bb 00 00 00 00 mov $0×0,離
8048094: cd 80 int $0×80
pr0cess@pr0cess:~$
噢?。?!這個(gè)SB的程序在
8048074: b8 04 00 00 00 mov $0×4,陎
這里就已經(jīng)被00截?cái)嗔?,完全不能用于shellcode,只能作為一般的匯編程序運(yùn)行 ?,F(xiàn)在來分析下為什么會(huì)出現(xiàn)這種情況 。現(xiàn)看這兩段代碼:
movl $4,陎
movl $1,離
這兩條指令使用的是32位(4字節(jié))的寄存器EAX和EBX,而我們卻只分別賦值了1個(gè)字節(jié)到寄存器中,所以系統(tǒng)會(huì)用NULL字符(00)來填充剩下的字節(jié)空間,從而導(dǎo)致shellcode被截?cái)?。知道了原因就可以找到很好的解決方法了,一個(gè)EAX寄存器是32位,32位寄存器也可以通過16位或者8位的名稱引用,我們通過AX寄存器來訪問第一個(gè)16位的區(qū)域(低16位),繼續(xù)通過對(duì)AL的引用EAX寄存器的低8位被使用,AH使用AL后的高8位 。
EAX寄存器的構(gòu)成如下:

推薦閱讀