緩沖區溢出的攻擊大致分為以下這些:
棧溢出:未檢查輸入緩沖區長度,導致數組越界,覆蓋棧中局部變量空間之上的棧楨指針%ebp以及函數返回地址retaddr, 當函數返回執行ret指令時,retaddr從棧中彈出,作為下一條指令的地址賦給%eip寄存器,繼而改變原程序的執行流程指向我們的 shellcode.
堆溢出:一種是和傳統的棧溢出一樣, 當輸入超出malloc()預先分配的空間大小,就會覆蓋掉這段空間之后的一段存儲區域,如果該存儲區域有一個重要的變量比如euid,那么我就可以用它 來攻擊。另一種是典型的double-free堆腐敗,在內存回收操作中,合并相鄰空閑塊重新插入雙向鏈表時會有一個寫4字節內存的操作,如果弱點程序由 于編程錯誤free()一個不存在的塊,我們就可以精心偽造這個塊,從而覆蓋任何我們想要的值:函數的返回地址、庫函數的.plt地址等
格式化字符竄漏洞:如果格式竄由用戶定制,攻擊者就可以任意偽造格式竄,利用*printf()系列函數的特性就可以窺探堆棧空間的內容,超常輸入可以引發傳統的緩沖區溢出,或是用”%n”覆蓋指針、返回地址等。
*printf()
整形變量溢出:利用整數的范圍、符號等問題觸發安全漏洞,大多數整形溢出不能直接利用,但如果該整形變量決定內存分配等操作,我們就有可能間接利用該漏洞。
其他的攻擊手法:只能算是手法,不能算是一種單獨的類別。利用ELF文件格式的特性如:覆蓋.plt(過程連接表)、.dtor(析構函數指針)、.got(全局偏移表)、return-to-libc(返回庫函數)等的方式進行攻擊。
回答所涉及的環境:聯想天逸510S、Windows 10。
緩沖區溢出的攻擊大致分為以下這些:
棧溢出:未檢查輸入緩沖區長度,導致數組越界,覆蓋棧中局部變量空間之上的棧楨指針%ebp以及函數返回地址retaddr, 當函數返回執行ret指令時,retaddr從棧中彈出,作為下一條指令的地址賦給%eip寄存器,繼而改變原程序的執行流程指向我們的 shellcode.
堆溢出:一種是和傳統的棧溢出一樣, 當輸入超出malloc()預先分配的空間大小,就會覆蓋掉這段空間之后的一段存儲區域,如果該存儲區域有一個重要的變量比如euid,那么我就可以用它 來攻擊。另一種是典型的double-free堆腐敗,在內存回收操作中,合并相鄰空閑塊重新插入雙向鏈表時會有一個寫4字節內存的操作,如果弱點程序由 于編程錯誤free()一個不存在的塊,我們就可以精心偽造這個塊,從而覆蓋任何我們想要的值:函數的返回地址、庫函數的.plt地址等
格式化字符竄漏洞:如果格式竄由用戶定制,攻擊者就可以任意偽造格式竄,利用
*printf()系列函數的特性就可以窺探堆棧空間的內容,超常輸入可以引發傳統的緩沖區溢出,或是用”%n”覆蓋指針、返回地址等。整形變量溢出:利用整數的范圍、符號等問題觸發安全漏洞,大多數整形溢出不能直接利用,但如果該整形變量決定內存分配等操作,我們就有可能間接利用該漏洞。
其他的攻擊手法:只能算是手法,不能算是一種單獨的類別。利用ELF文件格式的特性如:覆蓋.plt(過程連接表)、.dtor(析構函數指針)、.got(全局偏移表)、return-to-libc(返回庫函數)等的方式進行攻擊。
回答所涉及的環境:聯想天逸510S、Windows 10。