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 靜態建立類物件 是...