1.一種Android系統(tǒng)的堆溢出漏洞驗證裝置,其特征在于,所述裝置包括漏洞檢測模塊、利用判定模塊和利用驗證模塊;
其中,漏洞檢測模塊,用于向堆緩沖區(qū)填寫第一輸入樣本,檢測是否發(fā)生堆溢出,以確定堆溢出漏洞的存在性;
利用判定模塊,用于根據(jù)漏洞檢測模塊的結(jié)果,向堆緩沖區(qū)填寫第二輸入樣本,通過執(zhí)行漏洞引發(fā)Android系統(tǒng)的系統(tǒng)進程崩潰,以確定堆溢出漏洞被利用的可能性;
利用驗證模塊,用于根據(jù)利用判定模塊的結(jié)果,向堆緩沖區(qū)填寫第三輸入樣本,通過執(zhí)行漏洞控制Android系統(tǒng)的系統(tǒng)進程的執(zhí)行流程,以驗證堆溢出漏洞的可利用性。
2.根據(jù)權(quán)利要求1所述的裝置,其特征在于,所述第一輸入樣本比堆緩沖區(qū)大小多四個字節(jié),多出的該四個字節(jié)為溢出值value1,用來覆蓋堆中C++對象的虛函數(shù)表指針;
所述漏洞檢測模塊用于:創(chuàng)建C++對象,監(jiān)控該對象所在的堆內(nèi)存區(qū)域;該內(nèi)存區(qū)域的前四個字節(jié)存放虛函數(shù)表指針,記錄該值為vftp1;向堆緩沖區(qū)填寫第一輸入樣本,記錄該內(nèi)存區(qū)域的前四個字節(jié)的值為vftp2;如果滿足條件vftp2!=vftp1且vftp2=value1,確定C++對象的虛函數(shù)表指針被第一輸入樣本的溢出值覆蓋,確定堆溢出漏洞存在。
3.根據(jù)權(quán)利要求1所述的裝置,其特征在于,所述利用判定模塊用于:構(gòu)造第二輸入樣本,所述第二輸入樣本比緩沖區(qū)大小多四個字節(jié),多出的該四個字節(jié)為溢出值,并且該值位于堆緩沖區(qū)的內(nèi)存地址區(qū)間內(nèi),用來覆蓋堆中C++對象的虛函數(shù)表指針;
向堆緩沖區(qū)填寫所述第二輸入樣本,堆溢出后引發(fā)系統(tǒng)進程崩潰,基于系統(tǒng)進程在虛函數(shù)調(diào)用點崩潰,確定堆溢出漏洞利用可能性。
4.根據(jù)權(quán)利要求1所述的裝置,其特征在于,所述利用驗證模塊用于構(gòu)造第三輸入樣本,所述第三輸入樣本比緩沖區(qū)大小多四個字節(jié),包含:溢出值、偽造虛函數(shù)表、偽造函數(shù)以及填充數(shù)據(jù);
其中,多出的該四個字節(jié)為溢出值,其值被設(shè)置為偽造虛函數(shù)表在堆內(nèi)存空間中的起始地址,用于覆蓋C++對象的虛函數(shù)表指針;
其中,偽造虛函數(shù)表中含有一個偽造函數(shù)指針,其值被設(shè)置為偽造函數(shù)在堆內(nèi)存空間中的起始地址,用來誤導(dǎo)系統(tǒng)進程調(diào)用相應(yīng)的虛函數(shù),執(zhí)行偽造函數(shù);
其中,偽造函數(shù)由多個匯編指令組成,用于將堆緩沖區(qū)的內(nèi)存區(qū)域標(biāo)記為可執(zhí)行,并且實現(xiàn)一個顯式的功能;
其中,填充數(shù)據(jù),用于追加在偽造虛函數(shù)表和偽造函數(shù)之后,以實現(xiàn)堆內(nèi)存空間的字節(jié)對齊,并保證所述第三輸入樣本的大小比緩沖區(qū)大小多四個字節(jié)。
5.根據(jù)權(quán)利要求4所述的裝置,其特征在于,所述利用驗證模塊用于:
向堆緩沖區(qū)填寫第三輸入樣本,觸發(fā)堆緩沖區(qū)溢出;
C++對象的虛函數(shù)表指針將會被溢出值覆蓋,指向堆內(nèi)存空間中偽造虛函數(shù)表;
系統(tǒng)進程調(diào)用虛函數(shù),根據(jù)被覆蓋的虛函數(shù)表指針找到偽造虛函數(shù)表,被偽造函數(shù)指針錯誤地引導(dǎo)到偽造函數(shù)處執(zhí)行指令;
基于執(zhí)行偽造的函數(shù),確定堆溢出漏洞可利用性。
6.一種Android系統(tǒng)的堆溢出漏洞驗證方法,其特征在于,包括:
步驟1,向堆緩沖區(qū)填寫第一輸入樣本,檢測是否發(fā)生堆溢出,以確定Android系統(tǒng)是否存在堆溢出漏洞;
步驟2,基于堆溢出漏洞存在的檢測結(jié)果,向堆緩沖區(qū)填寫第二輸入樣本,執(zhí)行漏洞引發(fā)Android系統(tǒng)的系統(tǒng)進程崩潰,確定堆溢出漏洞被利用的可能性;
步驟3,基于堆溢出漏洞可能可利用,向堆緩沖區(qū)填寫第三輸入樣本,執(zhí)行漏洞控制Android系統(tǒng)的系統(tǒng)進程的執(zhí)行流程,驗證堆溢出漏洞的可利用性。
7.根據(jù)權(quán)利要求6所述的方法,其特征在于,其中,所述第一輸入樣本比緩沖區(qū)大小多四個字節(jié),多出的該四個字節(jié)為溢出值value1,用來覆蓋堆中C++對象的虛函數(shù)表指針;
所述步驟1進一步包括:
創(chuàng)建C++對象,監(jiān)控該對象所在的堆內(nèi)存區(qū)域,該內(nèi)存區(qū)域的前四個字節(jié)存放的是虛函數(shù)表指針,記錄該值為vftp1;
向堆緩沖區(qū)填寫第一輸入樣本,記錄該內(nèi)存區(qū)域的前四個字節(jié)的值為vftp2;如果滿足條件vftp2!=vftp1且vftp2=value1,確定C++對象的虛函數(shù)表指針被第一輸入樣本的溢出值覆蓋,確定堆溢出漏洞存在。
8.根據(jù)權(quán)利要求6所述的方法,其特征在于,所述步驟2進一步包括:
構(gòu)造第二輸入樣本,所述第二輸入樣本比緩沖區(qū)大小多四個字節(jié),多出的該四個字節(jié)為溢出值,并且該溢出值位于堆緩沖區(qū)的內(nèi)存地址區(qū)間內(nèi),用來覆蓋堆中C++對象的虛函數(shù)表指針。;
向堆緩沖區(qū)填寫所述第二輸入樣本,堆溢出后引發(fā)系統(tǒng)進程崩潰,基于系統(tǒng)進程在虛函數(shù)調(diào)用點崩潰,確定堆溢出漏洞利用可能性。
9.根據(jù)權(quán)利要求6所述的方法,其特征在于,所述第三輸入樣本比緩沖區(qū)大小多四個字節(jié),包含:溢出值、偽造虛函數(shù)表、偽造函數(shù)以及填充數(shù)據(jù);
其中,多出的該四個字節(jié)為溢出值,其值被設(shè)置為偽造虛函數(shù)表在堆內(nèi)存空間中的起始地址,用于覆蓋C++對象的虛函數(shù)表指針;
其中,偽造虛函數(shù)表中含有一個偽造函數(shù)指針,其值被設(shè)置為偽造函數(shù)在堆內(nèi)存空間中的起始地址,用來誤導(dǎo)系統(tǒng)進程調(diào)用相應(yīng)的虛函數(shù),執(zhí)行偽造函數(shù);
其中,偽造的函數(shù)由多個匯編指令組成,用于將堆緩沖區(qū)的內(nèi)存區(qū)域標(biāo)記為可執(zhí)行,并且實現(xiàn)一個顯式的功能;
其中,填充數(shù)據(jù),用于追加在偽造虛函數(shù)表和偽造函數(shù)之后,以實現(xiàn)堆內(nèi)存空間的字節(jié)對齊,并保證所述第三輸入樣本的大小比緩沖區(qū)大小多四個字節(jié)。
10.根據(jù)權(quán)利要求9所述的方法,其特征在于,所述步驟3進一步包括:
向堆緩沖區(qū)填寫第三輸入樣本,觸發(fā)堆緩沖區(qū)溢出;
C++對象的虛函數(shù)表指針將會被溢出值覆蓋,指向堆內(nèi)存空間中偽造虛函數(shù)表;
系統(tǒng)進程調(diào)用虛函數(shù),根據(jù)被覆蓋的虛函數(shù)表指針找到偽造虛函數(shù)表,被偽造的函數(shù)指針錯誤地引導(dǎo)到偽造函數(shù)處執(zhí)行指令;
基于執(zhí)行偽造的函數(shù),確定堆溢出漏洞可利用性。