1.保护机制

if (__builtin_expect (FD->bk != P || BK->fd != P, ))
malloc_printerr (check_action, "corrupted double-linked list", P);

这个就是所谓的堆指针的check。

FD其实就是p->fd

BK其实就是p->bk

就是说:p->fd->bk=p

    p->bk->fd=p

就是做这么一个验证。

这个验证找一个指向堆的指针就可以绕过,但是要知道指针变量的地址,否则就是白扯。

为了触发unlink,需要伪造一个(2个)新块才行。其实就是

伪造的空块|伪造的使用中的块

释放使用中的伪造块就会造成伪造的空块调用unlink,因为这个触发了空块合并机制。

怎么指定的前块为空呢?

1.当前的prve_size有值,就是不为零

2.第三个flag为0,表示前块为空

05-21 01:24