堆噴射中的問題

2021-10-04 08:50:35 字數 2528 閱讀 4735

在csdn上邊講解堆噴射的文章有很多,這裡也就不再贅述,記錄一下自己在看的過程中遇到的一些問題:

1、第乙個問題其實就是比較簡單的什麼是堆噴射?

事實上,對於堆噴射的概念一直沒有乙個統一的定義,大家都是通過對堆噴射的原理的理解進行自我解讀的。我認為堆噴射就是,通過在堆中申請大量空間,將這段空間使用shellcode和滑板指令結合成的**段進行填充,真樣的話就會導致程序空間的大量位址被占用,之後再配合其它的攻擊手段來控制程式的eip,使程式執行到shellcode上。

2、什麼是滑板指令?滑板指令的作用是什麼?

首先要清楚,我們的滑板指令是和我們的shellcode結合形成一段**段的,之後使用這段**段來填充申請到的堆空間。

其次,當我們控制了eip之後,目的是執行我們設計好的shellcode,但是具體要怎麼將eip指向shellcode這個過程沒有辦法做到那麼精準。滑板指令的作用這個時候就發揮出來了:

1、滑板指令一般是nop指令或者類nop指令,所謂的類nop指令就是執行之後不會對我們執行shellcode指令造成影響。

2、滑板指令其實對於shellcode也起到一定的保護作用,防止造成shell code的破壞。所謂保護作用,用下圖來解釋

3、滑板指令的另乙個作用就是增加shellcode的命中率

3、怎麼挑選滑板指令?

就如同我們上邊所說,滑板指令再挑選方面其實就是乙個要素,是空指令或者是類空指令,空指令:0x90 類空指令:0x0a0a0a0a,0x0c0c0c0c,0x0d0d0d0d 因此原則上來說只要是空指令或者是類空指令都可以成為我們的選擇,具體要選擇哪乙個指令還得看其他要素

4、為什麼一般挑選0x0c0c0c0c

上邊說如何挑選滑板指令,事實上我們要覆蓋到的位址,以及這個指令的自指向性都是我們考慮的要素,上邊說的類空指令或者空指令只是滑板指令挑選的「門檻」。

這裡說到指令的自指向,覺得有必要解釋一下:

1、我們說的shellcode和滑板指令組成的**段在堆空間是怎樣的分布狀態:

在一段堆空間會有很多這樣的**段,而且從圖上也可以很明顯的看出滑板指令的大小比shellcode的大小大很多,這是為什麼呢?其實這樣做是為了提高shellcode的生存率,提高shellcode的命中率,因為我們知道shellcode必須命中shellcode開始的第一條指令才能夠正常工作,如果**段分布是下邊這種情況的話,反而不容易命中:

2、上邊介紹了**段在堆空間的分布狀態,接下來我們說一下一般的觸發堆噴射的方式(也是我在查閱各方資料中見到的最頻繁的堆噴射的方式):通過覆蓋虛表指標的方式來構造自指向,這裡有必要說明一下虛函式的實現方式:

虛函式的實現方式:

虛函式是c++中的一種函式定義形式,虛函式(virtual function)是通過虛函式表(virtual table)來進行索引的,而這個虛函式表裡邊存放的是乙個類的虛函式的位址表,靠著這張表可以解決繼承、覆蓋的問題。當然這不是重點,重點是虛函式的實現方式是依靠虛表進行索引的。當呼叫乙個虛函式的時候,它的大致過程如下:

每乙個class產生一堆指向虛函式的指標,放在**之中。這個**稱之為虛函式表(virtual table,vtbl)

其實可以簡單的把這個過程當作是乙個陣列的索引過程,這樣就好理解的多。

我們上邊說的自指向的意思就是借用虛函式實現的原理來實現的,具體過程如下:

我們把虛函式指標府改為0x0c0c0c0c,這個時候程式會跳轉到0x0c0c0c0c的位址空間去執行相應的指令,而這個時候我們同樣使用滑板指令0x0c0c0c0c去覆蓋這段空間,就導致它指向自己,這個過程就是所謂的自指向。一直執行到我們的shellcode就達成目的了

5、看好多文章都說覆蓋200mb以上的內容,為什麼?

上邊解釋了關於滑板指令的選取過程,到這裡其實就好理解多了,我們知道在堆噴射中0x0c0c0c0c是乙個臭名昭著的位址,我們可以計算一下,200m轉換過來對應十六進製制的c80 0000‬,如果我們堆噴射覆蓋到200m以上的時候可以肯定的是一定會覆蓋到0x0c0c0c0c這個位址的,所以才會說一般情況下覆蓋到200m以上的內容

6、可能在堆噴射的時候,除錯過程中可以執行,但是實際實現的時候不能成功,什麼原因呢?

這個又可能是你處在除錯狀態下,除錯的時候shellcode指向都已經調整好了,但是有乙個問題不能忽略,在除錯模式和正常模式下,堆的管理策略是不一樣的。除錯堆與除錯棧不同,不能直接用偵錯程式 ollydbg、windbg 來引導程式,否則堆管理函式 會檢測到當前程序處於除錯狀態,而使用除錯態堆管理策略。

應該在程式開始的地方下斷點,在程式斷下來的時候再附加偵錯程式,進行除錯

相關參考資料

反射中屬性的用法

首先自定義屬性繼承 system.attribute attributeusage attributetatget.all,allowmultpie true,inherited false 關於自定義屬性的約束 作用範圍 可否多次設定 可否繼承 public class myattribute a...

詳述反射中的方法

反射系列傳送門 如何獲取class類物件 詳述反射中的構造方法 詳述反射中的普通方法 本篇 詳述反射中的屬性 現有學生類如下 public class student private int dohousework int a,string scores 1 獲取所有public級別的方法,包括其父...

NHibernate 關係對映中的 Formula

在 nhibernate 的實體類對映中,如果實體類的屬性需要通過 sql 計算才能得到,則可以使用 formula 選項解決。nhibernate 對 formula 的要求如下 場景1 對映需要計算的屬性 以下面的 category 對映為例 1 2 3 4 5 6 7 8 9 10 11 12...