【Linux堆利用】House of Force

寫在前面的話

其實我也是照葫蘆畫瓢(但學習本來就是這麼一件事),首先基本的原理你的搞懂吧。具體參考CTF-WIKI,那個真的是說得非常清楚了!我也只是記錄一下自己的學習筆記!

原理

首先House of Force這種利用方法,主要強調一點就是堆溢出,溢出到能夠覆蓋top chunk的大小,也即是size域!,這就是最基本的利用條件。

因爲當我們每一次malloc(),其實都是在申請一塊chunk,在物理結構上,因爲我們現在能夠申請的chunk的位置是在ptmalloc給我們分配的分配區裏面,就在這個這個分配區裏,只要總的大小沒有超過當前的分配區,那麼我們每一個malloc分配到的chunk就是在物理上一個接着一個的。所以問題就來了!

當我們malloc一個空間的時候,在申請到的這個chunk的後面就是top chunk,然而當我們輸入的數據大小超過我們申請的範圍,就會溢出到top chunk的位置。

對於top chunk來說,ptmalloc對於我們的要求就是當前top chunk的大小要滿足分配給你申請的大小之後,剩下的大小還必須要達到最小chunk的要求,也就是MINSIZE + 你申請的大小 <= 當前top chunk的大小

這個只是說一下這個點,但是要做到就非常簡單了,我們直接讓size域非常大就解決問題了,通常我們會傳入-1,因爲ptmalloc的源碼中對於size使用unsigned long進行強轉抓換,-1轉過來就是最大的數了

上面其實就做了一件事,溢出覆蓋top chunk的size域非常大

接下來我們就要開始malloc()申請內存了,這裏通過Linux的內存佈局我們明白heap區域所處在的位置,所以要利用的話,一種是讓top chunk向低地址延伸然後就跑到了我們用戶程序的位置,另外一種是向高地址的話就跑到了libc區域了!

malloc(); // 改變top chunk的指針
mem = malloc();	// 實現任意地址寫 向高地址或低地址都可以
*mem = "nice";

實例

向低地址移動

int main()
{
	long *ptr, *ptr1;
	ptr = malloc(0x10);
	ptr = (long *)(((long)ptr) + 24);
	*ptr = -1;
	malloc(-4120); // 減少top chunk的指針
	malloc(0x10);
}

向高地址移動

int main()
{
	long *ptr, *ptr1;
	ptr = malloc(0x10);
	ptr = (long *)(((long)ptr) + 24);
	*ptr = -1;
	malloc(140737345551056); // 增大top chunk的指針
	malloc(0x10);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章