1. 程式人生 > >關於C++程式碼緩衝區溢位

關於C++程式碼緩衝區溢位

緩衝區溢位通常表現為一個最為常見的漏洞而存在於今天的各種軟體之中,黑客可以用惡意的輸入,從而更改程式的執行流程,由此入侵相應的程序、電腦、或整個域。如果程序運行於一個高度受信的賬戶之下,如管理員或本地系統賬戶,那麼黑客帶來的破壞將是極其嚴重,並有潛在廣泛傳播的危險。近幾年來爆發的一些"知名"病毒,如紅色程式碼、衝擊波、震盪波等等,都源於C/C++程式碼緩衝區溢位的結果。

  從程式的角度來看,緩衝區溢位只是一個再簡單不過的程式設計錯誤--都是關於複製一個記憶體區域的內容到另一個記憶體區域,而目標記憶體區域容量太小無法容納。以下的程式碼作了簡單的演示:

  char* source = "A reasonably long string";

  char dest[10];

  ::strcpy(dest, source);

  在本例中,源字串的長度為25個字元(包括了空結束符),它對目標記憶體塊來說,無疑太大了,而目標記憶體塊宣告在堆疊上;當此程式碼執行時,將會破壞掉原有堆疊,程式會因為一個訪問違例而崩潰。如果此源記憶體塊由外部第三方提供,那麼就有可能存在一個漏洞,因為它允許傳入函式的記憶體塊以一種特定的方式修改堆疊。

  當在C/C++中呼叫一個函式時,呼叫函式的返回地址被存放在堆疊中,因此在被呼叫函式執行完畢時,執行流程能重新返回到原處。如果呼叫了一個可能包含潛在緩衝區溢位的函式,返回地址可能會被修改,而且執行流程將會跳到緩衝區資料中指定的地方。通過改變函式的返回地址,攻擊者可獲取程序中任意位置的程式碼以執行,一般而言,主要可以兩種方式被利用:

  ·如果帶有漏洞的程式是已知、且容易訪問到的,攻擊者可查詢某函式的地址,這通常會在所有程序例項的一處固定地址處被找到;並修改堆疊,等著此函式被呼叫。

  ·要執行的指令可作為緩衝區的一部分傳遞到程序地址空間,攻擊者利用此來完成攻擊。

相關推薦

關於C++程式碼緩衝區溢位

緩衝區溢位通常表現為一個最為常見的漏洞而存在於今天的各種軟體之中,黑客可以用惡意的輸入,從而更改程式的執行流程,由此入侵相應的程序、電腦、或整個域。如果程序運行於一個高度受信的賬戶之下,如管理員或本地系統賬戶,那麼黑客帶來的破壞將是極其嚴重,並有潛在廣泛傳播的危險。近幾年

C 語言緩衝區溢位的實戰

開發十年,就只剩下這套架構體系了! >>>   

突破C++的虛擬指標--C++程式的緩衝區溢位攻擊

backend注:本文來自Phrack56期的《SMASHING C++ VPTRS》。正如大多數國外黑客的文章,技術原理及應用都講得比較詳細,但所提供的原始碼似乎總是會存在不大不小的問題。這也許是因為他們覺得應該讓讀者自己去研究和除錯,以更好地掌握這些技術。或許以後我也會

C++緩衝區溢位

gets(char* ) 根本不執行邊界檢查,它會向緩衝區連續寫入,其危險級別可以說是近乎C/C++中最高。 遇到 EOF 字元或換行字元之前,不會停止讀入文字,這還都不算什麼,這個函式最可怕的一點是會寫出堆溢位; 作為一個替代方法,可以使用方法 fgets()。它可以做與

程式設計正規化13聽課筆記——緩衝區溢位C++接受可變引數

在《程式設計正規化》13中老師給出了幾個有趣的例子,這裡簡單實現一下做個備忘。 緩衝區溢位VS隱形無限遞迴 下面是兩個由陣列溢位導致的宕機,但是出現的原因是不同的。 #include <iostream> #include <cstd

Apple全系列緩衝區溢位核心RCE(CVE-2018-4407)poc

# CVE-2018-4407 ICMP DOS # https://lgtm.com/blog/apple_xnu_icmp_error_CVE-2018-4407 # from https://twitter.com/ihackbanme import sys try:    

C程式碼實現從FTP上下載檔案

從FTP上下載檔案這個功能我早就想實現了,但是苦於百度的文章大多是下載連結,一直沒捨得積分下載,這次通過查閱MSDN,將一套下載流程函式摸了一下,寫出程式碼實現從FTP下載檔案 環境 VS2015 程式碼: #include <iostream> #include <

367. Valid Perfect Square(python+cpp)(c++程式碼超時

題目: Given a positive integer num, write a function which returns True if num is a perfect square else False. Note: Do not use any built-in

解決IIS服務使用C#程式碼在Windows Server 2012上無法啟動Excel的問題

錯誤資訊:檢索 COM 類工廠中 CLSID 為 {00024500-0000-0000-C000-000000000046} 的元件失敗,原因是出現以下錯誤: 80070005 拒絕訪問。 (異常來自 HRESULT:0x80070005 (E_ACCESSDENIED)) 參考解決步驟如下: 元件服務

linux系統下如何在vscode中除錯C++程式碼

本篇部落格以一個簡單的hello world程式,介紹在vscode中除錯C++程式碼的配置過程。 1. 安裝編譯器 vscode是一個輕量的程式碼編輯器,並不具備程式碼編譯功能,程式碼編譯需要交給編譯器完成。linux下最常用的編譯器是gcc,通過如下命令安裝: sudo apt-get instal

C++程式碼規範和CodeReview

C++程式碼規範和CodeReview 背景 最近手頭上的開發工作基本已經完成主要功能,其後續進行的工作主要在細小功能的調整和完善上,週末在家看書,想到了CodeReview,想把這件事在組內推廣下(其實CodeReview應該是在開發過程中進行的,現在提出,也是希望以後不要步此後

C程式碼效能優化總結

轉自:https://blog.csdn.net/chenyq991/article/details/79047741 1、優化程式碼框架 個人覺得程式碼架構對效能的影響至關重要,就好骨架之於人,所以我把這個放在第一點。舉個簡單的例子: 優化前: void main() { whi

曲速未來 披露:由macOS NFS客戶端中的緩衝區溢位引起的核心RCE

區塊鏈安全諮詢公司 曲速未來 訊息:有安全人員在Apple的macOS作業系統核心中發現的幾個堆疊和堆緩衝區溢位。Apple將這些漏洞歸類為核心中的遠端程式碼執行漏洞,因此它們非常嚴重。攻擊者可能會利用它們遠端入侵Mac。或者,通過物理訪問計算機,攻擊者可以作為訪客使用者登入(無需密碼),然後使用這

UE4 C++程式碼中使用材質,字型等資源

當我使用ue4 editor製作了一個材質(Material)或字型(Font)之後,該材質和字型等資源不僅可以在editor中使用,還可以在C++程式碼中使用。 下圖為我在editor中製作的資源: 我們可以通過右鍵點選該資源,點選“Copy Reference”來獲得資源的參考路徑。

(四)NDK開發之 java 與C/C++ 程式碼互相呼叫

java 呼叫c/c++ 的方法,很簡單。我們勾選建立支援C/C++ 專案的時候,就已經生成了一個Demo 下面主要介紹,C/C++ 呼叫 java 的方法。   一、訪問 java 成員非靜態成員變數: JNI 呼叫java非靜態變數的 方法名格式 : Ge

android studio 3.0 C/C++ 程式碼自動補全

 最近在搞NDK 開發,使用 android studio  編寫C/C++語言 ,但是一直沒有程式碼提示功能。這就很蛋疼了。我的android studio 版本是3.2.0。 然後網上搜了很多的資料,什麼 建立專案的時候 勾選   Inculde C++ s

c#程式碼實現排序演算法之歸併排序

歸併排序的平均時間複雜度為O(nlogn),最好時間複雜度為O(nlogn),最壞時間複雜度為O(nlogn),空間複雜度為O(n),是一種穩定的演算法。 1.將待排序序列r(1),r(2),…,r(n)劃分為兩個長度相等的子序列r(1),…r(n/2)和r(n/2+1),…,r

c#程式碼實現排序演算法之快速排序

快速排序的平均時間複雜度為O(nlog2n),最好時間複雜度為O(nlog2n),最壞時間複雜度為O(n²),空間複雜度為O(log2n),是一種不穩定的演算法。 1.劃分:選定一個記錄作為軸值,以軸值為基準將整個序列劃分為兩個子序列r(1)…r(i-1)和r(i+1)…r(n)

c#程式碼實現排序演算法之氣泡排序

氣泡排序的平均時間複雜度為O(n²),最好時間複雜度為O(n),最壞時間複雜度為O(n²),空間複雜度為O(1),是一種穩定的演算法。 1.將整個待排序的記錄序列劃分成有序區和無序區,初始時有序區為空,無序區包括所有待排序的記錄。 2.對無序區從前向後依次比較相鄰記錄,若反序則交

c#程式碼實現排序演算法之選擇排序

選擇排序的平均時間複雜度為O(n²),最好時間複雜度為O(n²),最壞時間複雜度為O(n²),空間複雜度為O(1),是一種不穩定的演算法。 1.將整個記錄序列劃分為有序區和無序區,初始時有序區為空,無序區含有待排序的所有記錄。 2.在無序區查詢值最小的記錄,將它與無序區的第一個記