在堆上偽造fast chunk,除錯分析

2021-10-16 08:31:01 字數 2519 閱讀 9727

1.doubble free在堆上偽造fast chunk

原始c檔案

#include

#define notenum 256

struct note

;struct note_list

;struct note_list *list;

void

init_env()

void

init_notes()

}int

read_len

(char

*dst,

int num)

intread_number()

intmenu()

void

new_note()

for(

int i =

0; i < list->total;

++i)

if(list->notes[i]

.inuse ==0)

if(len >

4096

) len =

4096

;char

*content =

(char*)

malloc

(len)

;printf

("enter your note: ");

read_len

(content, len)

; list->notes[i]

.inuse =1;

list->notes[i]

.size = len;

list->notes[i]

.content = content;

list->inuse++

;puts

("done.");

return;}

}void

edit_note()

printf

("length of note: ");

int len =

read_number()

;if(len <=0)

if(len >

4096

) len =

4096;if

(len != list->notes[n]

.size)

printf

("enter your note: ");

read_len

(list->notes[n]

.content, len)

;puts

("done.");

}void

delete_note()

list->inuse--

; list->notes[n]

.inuse =0;

list->notes[n]

.size =0;

free

(list->notes[n]

.content)

;puts

("done.");

}else

}void

list_note()

}else

}void

main()

}}

ida逆向之後的delete函式

危險的操作

​ 在進行堆釋放的時候,堆中的指標沒有指向null,造成懸掛指標的問題

漏洞利用

首先申請5個堆,檢視記憶體空間

2. 刪除堆0、堆1,檢視記憶體空間

- 刪除的兩個chunk,其中 1 指向 0
新建乙個堆,檢視記憶體空間

再次釋放 note 1 ,則note 1 content 指向的chunk的型別將會改變

C 在堆上建立物件,還是在棧上?

如果需要在堆上建立物件,要麼使用new運算子,要麼使用malloc系列函式。這點沒有異議。真正有異議的是下面的 c 1 object obj 此時,obj是在棧上分配的嗎?要回答這個問題,我們首先要理解這個語句是什麼意思。這個語句就是代表著,在棧上建立物件嗎?其實,這行語句的含義是,使物件obj具有...

C 在堆上建立物件還是在棧上建立物件

對於 object obj obj是在棧上分配的嘛?其實,這個語句的含義是,使物件obj具有 自動儲存的性質 意思就是這個物件的儲存位置取決於其宣告所在的上下文。如果這個語句出現在函式內部,那麼它就在棧上建立物件。如果這個語句不是在函式內部,而是作為乙個類的成員變數,則取決於這個類的物件是如何分配的...

如何讓類物件只在棧(堆)上分配空間?

一般情況下,編寫乙個類,是可以在棧或者堆分配空間。但有些時候,你想編寫乙個只能在棧或者只能在堆上面分配空間的類。這能不能實現呢?仔細想想,其實也是可以滴。在c 中,類的物件建立分為兩種,一種是靜態建立,如a a 另一種是動態建立,如a ptr new a 這兩種方式是有區別的。1 靜態建立類物件 是...