關於double free的問題?

這個問題在stackoverflow上已經有了,但是並沒有能解決疑惑的回答。

free() : no double free detected

#include &
#include &
int main() {
char *a=malloc(24);
char *b=malloc(24);
free(a);
free(a);
}

上述代碼編譯運行的話會產生error,畢竟對同一指針free兩次。

#include &
#include &
int main() {
char *a=malloc(24);
char *b=malloc(24);
free(a);
free(b);
free(a);
}

但是上述代碼不會出現任何問題,多次交替free a 和 b 並不會出現任何error,請問能否從底層的角度給出解答?


瀉藥。這個是libc之中的ptmalloc分配器的問題。在malloc內存比較小的時候,默認分配方式是fastchunk。而在free的之後的空閑內存使用單向鏈表串聯。由於fastbin在釋放的時候不清空inuse位的特定,所以兩次free不會crash。當時連續兩次free同一塊的話,在chunk加到單向鏈表頭的時候會檢查出來帶加入的和鏈表頭是同一個。

想要具體了解的話,可以看看ptmalloc源代碼。這東西很複雜,一兩句話說不清。


這個問題不是幾句話說的清楚的,建議讀源碼+調試

華庭寫過ptmalloc2源碼分析 建議精讀前26頁 粗讀後半部分

最重要的是動手gdb+peda 以及一些較好的調試堆工具 比如https://github.com/cloudburst/libheap

最後 2free以及uaf雖然不是堆溢出 但卻是常見的利用手法 有興趣可以刷ctf


當free(a)後,a會加入fastbin中,再次free(a)時,系統會檢查a是否與fastbin中的第一個chunk相同,相同則視為double free。

當free(a)後,a會加入fastbin中,再次free(b)時,b位於fastbin的第一個,那麼再次free(a)時,由於fastbin首位是b,就不會報錯了。


debug,……,不同系統libc實現不一樣的,android和linux也是不一樣的。


推薦閱讀:

如何評價「中國互聯網安全廠商在漏洞挖掘及防禦方面的地位舉足輕重」這句話?
做安全研究挖不到漏洞,很迷惘?
Pwn新手應該如何開始挖掘二進位漏洞(如UAF,stack overflow)?
關於web滲透,如何才能邁出關鍵的一步?

TAG:C編程語言 | CC | GLIBC | 漏洞挖掘 | CTFCaptureTheFlag |