漏洞利用概述

在期待繼續討論此主題的過程中,讓我告訴您一些有關漏洞的歷史,理論和實踐。 到現在為止,我們都聽說安全漏洞可能會付出巨大的代價,我們都知道我們必須保持軟件的最新性,我們都知道許多更新是由安全性錯誤引起的。 但是今天,我將告訴您一些有關如何發現和利用這些錯誤的信息🙂但是,在此之前,我們將澄清一些細節,以便獲得更好的概述。

開始之前

首先,我想告訴您,我們將專注於我學會利用的第一個漏洞,即已知的 緩衝區溢出,在此漏洞中,我們利用缺乏內存驗證的方式來做有趣的事情🙂但讓我們對其進行更多說明。

這不會是現實世界的情況

我不能教他們破壞他們觀看的任何程序-首先是因為這對他們的計算機很危險,其次是因為這將花費比我通常的單詞更多的時間。

我們去八十年代

我將向您展示我可以在筆記本電腦上完成的操作,但這並不意味著今天可以通過簡單的方式完成它-許多概念已經被利用了很多次,以至於有新的保護方法和新方法可以逃避它們已經出現了😛但這使我們回到了同一個地方,沒有空間可以告訴所有人🙂

它可能無法在您的處理器上運行

儘管我將使用一個非常簡單的示例,但我希望從一開始就很清楚,它的細節如此之多,千差萬別,如果您想嘗試的話,它可以和我一樣出現,也可能無法達到預期的效果。🙂但是您可以想像,我無法在這個領域中對此進行解釋,特別是因為通過本介紹,我已經講了300多個字,所以我們直截了當。

什麼是 緩衝區溢出

為了回答這個問題,我們首先必須了解這種結合的前半部分。

緩衝區

由於一切都與計算機中的內存有關,因此邏輯上必須有某種類型的信息容器。 當我們談論 輸入 輸出,我們直接談到 緩衝區。 為了簡短起見, 緩衝 這是一個定義大小的存儲空間,我們將在其中存儲大量信息,簡單simple

顧名思義,當緩衝區填充的信息超出其處理能力時,就會發生溢出。 但是為什麼這很重要?

也稱為棧,它們是一種抽像數據類型,我們可以在其中 疊 信息,它們的主要特徵是它們具有順序 LIFO(後進先出)。 讓我們考慮一下一疊盤子,我們將它們一個接一個地放在頂部,然後從頂部一個接一個地取出,這就是我們放置的最後一塊盤子(那一塊在上面) )是第一個盤子,顯然,如果我們一次只能拿出一個盤子,而我們決定按以下順序去做,那我們將要拿出什麼?

現在您已經知道了這兩個概念,我們必須將它們整理好。 堆棧很重要,因為我們運行的每個程序都有自己的程序 執行棧。 但是這個堆棧有一個 特色長大。 您唯一需要了解的是,在程序運行時,當調用函數時,堆棧從內存中的數字X變為數字(Xn)。 但是,為了繼續下去,我們必須理解另一個概念。

指針

這個概念使許多程序員在進入C語言世界時就發瘋了,實際上C編程的強大功能部分是由於使用了指針。 為了簡單起見,有一個指針 指向一個內存地址。 這聽起來很複雜,但並不是那麼複雜,我們的機器中都裝有RAM,對嗎? 好吧,這可以定義為 塊的連續排列,這些位置通常以十六進制數表示(從0到9,然後從A到F,例如0x0、0x1、0x6、0xA,0xF,0x10)。 奇怪的是,這裡是0x10 沒有 等於10😛如果將其轉換為十進制,將與說15相同。這在開始時也會使一個以上的混淆,但讓我們開始吧。

記錄

處理器可以與許多 記錄,用於將位置從物理內存傳輸到處理器,對於使用64位的體系結構,寄存器的數量很大,在這裡很難描述,但是要理解,寄存器就像指針一樣,它們指示其他內容,一個內存空間(位置)。

現在練習

我知道到目前為止,要處理的信息很多,但實際上,它們是一些複雜的問題,我試圖以一種非常簡單的方式進行解釋,我們將看到一個使用緩衝區的小程序,並且打破它來了解有關溢出的知識,顯然這不是一個真正的程序,我們將“逃避”當今使用的許多對策,只是為了展示things之前的工作方式,因為其中有些原則對於學習更複雜的事物是必不可少的

GDB

毫無疑問,這是一個很棒的程序,是C程序員最常用的程序之一,它有許多優點,它使我們能夠看到到目前為止我們一直在談論的所有內容,寄存器,堆棧,緩衝區等。讓我們看一下我們將用於示例的程序。

重新輸入.c

擁有。 克里斯托弗·迪亞茲·里維羅斯(Christopher Diaz Riveros)

這是一個相當簡單的程序,我們將使用該庫 stdio.h 以便能夠獲取信息並將其顯示在終端中。 我們可以看到一個名為 return_input 產生一個 緩衝 叫 排列,長度為30 字節 (char數據類型為1個字節長)。

功能 gets(array); 通過控制台和功能請求信息 printf() 返回數組的內容並在屏幕上顯示。

用C編寫的每個程序都以函數開頭 main(),它將僅負責調用return_input,現在我們將編譯該程序。

擁有。 克里斯托弗·迪亞茲·里維羅斯(Christopher Diaz Riveros)

讓我們來看看我剛才所做的事情。 選項 -ggdb 告訴gcc它必須使用gdb信息編譯程序,以便能夠正確調試。 -fno-stack-protector 這個選項顯然我們不應該使用,但是我們將要使用它,因為否則將有可能在堆棧中生成緩衝區溢出。 最後,我測試了結果。 ./a.out 它只是運行我剛剛編譯的內容,它要求我提供信息並返回。 運行🙂

警告事項

另一個注意這裡。 您能看到警告嗎? 顯然,當我們使用代碼或編譯時,這是要考慮的事情,這是顯而易見的,並且今天很少有具有該功能的程序 gets() 在代碼中。 Gentoo的一個優點是,通過編譯每個程序,我可以看到可能出了什麼問題,一個“理想”的程序不應該包含它們,但是您會驚訝地發現有這麼多大型程序具有這些警告,因為它們非常大,而且當同時有許多警告時,危險功能將難以跟踪。 現在,如果我們繼續

調試程序

擁有。 克里斯托弗·迪亞茲·里維羅斯(Christopher Diaz Riveros)

現在這部分可能有點令人困惑,但是由於我已經寫了很多篇幅,所以我無力解釋所有內容,如果您發現我的進度太快了,請抱歉。

撤防代碼

讓我們從查看編譯後的機器語言程序開始。

擁有。 克里斯托弗·迪亞茲·里維羅斯(Christopher Diaz Riveros)

這是我們主要功能的代碼 裝配,這就是我們的處理器所了解的,左側的行是內存中的物理地址, <+ n> 被稱為 抵消,基本上是從函數(main)開始到該語句(稱為 操作碼)。 然後我們看到指令的類型(push / mov / callq…)和一個或多個寄存器。 綜上所述,可以說是指示,其後是源/始發地和目的地。 <return_input> 指的是我們的第二個功能,讓我們看一下。

返回_輸入

擁有。 克里斯托弗·迪亞茲·里維羅斯(Christopher Diaz Riveros)

這有點複雜,但是我只想讓您檢查幾件事,有一個標籤叫做 <gets@plt> 最後一個操作碼稱為 retq 指示函數結束。 我們將在函數中放置幾個斷點 gets 另一個在 retq.

擁有。 克里斯托弗·迪亞茲·里維羅斯(Christopher Diaz Riveros)

現在,我們將運行程序以查看操作如何開始。

擁有。 克里斯托弗·迪亞茲·里維羅斯(Christopher Diaz Riveros)

我們可以看到出現了一個小箭頭,指示操作碼所在的位置,我希望他們將方向 0x000055555555469b,這是呼叫後的地址 return_input 在功能上 main ,這很重要,因為這是您收到完程序後應該返回的程序 輸入,讓我們進入該功能。 現在我們要在進入功能之前檢查內存 gets.

擁有。 克里斯托弗·迪亞茲·里維羅斯(Christopher Diaz Riveros)

我已經將main函數放回給您,並且由於您所看到的,我突出顯示了我所指的代碼。 內在性 已經分為兩個部分,我希望他們考慮到方向 0x7fffffffdbf0 (突擊隊之後從左邊的第一個 x/20x $rsp),因為這是我們用來檢查gets結果的位置,所以讓我們繼續:

破壞程序

擁有。 克里斯托弗·迪亞茲·里維羅斯(Christopher Diaz Riveros)

我強調了那些 0x44444444因為它們代表了我們的Ds🙂現在我們開始添加 輸入 到程序中,正如您所看到的,我們離所需地址只有兩行,我們將填充該行,直到在上一步中突出顯示的地址之前。

改變返迴路徑

現在我們已經設法在代碼的這一部分輸入了該函數的返回信息,讓我們看看如果更改地址🙂而不是轉到緊跟在前面的操作碼之後的操作碼的位置,會發生什麼,您如何看待我們回到 return_input? 但是為此,有必要用二進制寫我們想要的地址,我們將使用函數來完成 printf 來自bash🙂

擁有。 克里斯托弗·迪亞茲·里維羅斯(Christopher Diaz Riveros)

現在我們已經收到了兩次信息-肯定不是為此編寫的程序,但是我們設法破壞了代碼並使它重複了原本不應該做的事情。

感言

這個簡單的變化可以認為是 利用 非常基礎🙂他設法打破了程序,做了我們希望他做的事情。

這只是幾乎無限的要查看和添加的事物列表中的第一步,除了簡單地重複執行命令外,還有許多方法可以添加更多事物,但是這次我已經寫了很多東西,並且與 外殼編碼 我要說的不僅是文章,更是完整的書。 抱歉,如果我無法進一步瀏覽自己想要的主題,但是肯定會有機會🙂問候和感謝!


發表您的評論

您的電子郵件地址將不會被發表。 必填字段標有 *

*

*

  1. 負責數據:MiguelÁngelGatón
  2. 數據用途:控制垃圾郵件,註釋管理。
  3. 合法性:您的同意
  4. 數據通訊:除非有法律義務,否則不會將數據傳達給第三方。
  5. 數據存儲:Occentus Networks(EU)託管的數據庫
  6. 權利:您可以隨時限制,恢復和刪除您的信息。

  1.   2p2 他說:

    更加直接。 少寫,專注於重要的事情

    1.    克里斯·阿德 他說:

      嗨,謝謝你的評論。

      說實話,我已經削減了很多想法,但即使如此,在我看來,我也留下了最基本的想法,以便沒有編程知識的人可以得到一個想法。

      問候

      1.    匿名 他說:

        問題是那些沒有編程知識的人不會發現任何東西,因為一開始它太複雜了,但是那些懂得編程的人會喜歡直接。

        我想您不能覆蓋所有人,您必須選擇,在這種情況下,您犯了想要覆蓋很多內容的罪行。

        順便說一句,我作為建設性的批評告訴您,我喜歡這些話題,並希望您繼續寫文章,恭喜!

    2.    匿名 他說:

      我有同樣的感覺。

      1.    克里斯·阿德 他說:

        非常感謝你們!! 當事實是閱讀這些文章的編程水平較高的人員很少(至少可以根據評論推斷得出)時,很難理解如何吸引目標受眾。

        我當然想簡化一些需要廣泛了解的知識。 我希望您能理解,因為我才剛剛開始寫博客,所以我還沒有發現讀者了解並理解我所說的確切信息。 這將使說實話容易得多🙂

        我將在不降低格式個性化的情況下,盡量縮短其使用時間,因為將編寫方式與內容分開比想像中的要復雜一些,我至少將它們聯繫在一起,但我想最終我將能夠添加行而不是剪切內容。

        問候

  2.   馬里奧 他說:

    您在哪裡可以找到有關該主題的更多信息? 有推薦的書嗎?

    1.    克里斯·阿德 他說:

      我從Chris Anley,John Heasman,Felix Linder和Gerardo Richarte的《 The Shellcoder's Handbook》中獲得了示例,但是為了進行64位翻譯,我必須了解我的體系結構,《英特爾開發人員手冊》第2捲和第3卷是相當可靠的來源。 閱讀帶有'info gdb'命令的GDB文檔也是很好的。要學習Assembly和C,有很多很好的書,除了Assembly的書有些陳舊,因此還有很多空白需要填補。鍵入文檔。

      由於各種原因,shellcode本身如今已不再有效,但是學習新技術仍然很有趣。

      希望能有所幫助🙂問候

  3.   弗朗茨 他說:

    好文章,老博客 desdelinux 又重生了 =)
    當您說遠程外殼不夠有效時,是指旨在緩解攻擊的對策,他們將其稱為進攻性安全。
    問候並保持

    1.    克里斯·阿德 他說:

      非常感謝Franz🙂非常客氣的話,實際上,我的意思是今天的Shellcoding比我們在這裡看到的要復雜得多。 我們擁有ASLR(隨機存儲器位置生成器)堆棧保護器,各種措施和對策,這些措施和措施限制了可以注入到程序中的操作碼的數量,這僅僅是開始。

      問候,

  4.   免費軟件 他說:

    您好,您是否還會做另一部分擴展主題? 這真有趣

    1.    克里斯·阿德 他說:

      您好,該主題當然很有趣,但是我們要採取的複雜性級別會很高,可能涉及大量的帖子,以解釋了解彼此的各種先決條件。 我可能會寫關於它的文章,但不會是下面的文章,在繼續之前,我想寫一些話題。

      問候,謝謝分享

  5.   仙人掌 他說:

    很好! 您正在貢獻出色的帖子! 一個問題,我正在讀一本書“通過筆測試確保安全性”來開始IT安全性工作。 推薦這本書嗎? 您如何建議我開始詢問這些問題?

    1.    克里斯·阿德 他說:

      仙人掌,您好,這是一個關於漏洞的整個世界,而其他事實則要說,這在很大程度上取決於引起您注意的因素以及您的需求,IT經理不需要像筆測試者一樣知道,或脆弱性研究人員或法醫分析人員,災難恢復團隊擁有非常不同的技能。 顯然,他們每個人都需要不同水平的技術知識,我建議您開始確切地發現自己喜歡的東西,並開始吞噬書籍,文章和其他書籍,最重要的是,練習所有閱讀的內容,即使這些內容已經過時了,最終將有所作為。
      問候,

  6.   艾岑 他說:

    您好!
    非常感謝您解釋該主題,並評論了更多信息,我們有“ The Shellcoder's Handbook”。 我已經有待讀的書😉