在glibc2.31上已经失效。没有考虑tcache开启,属于较老的一种利用。
1.在栈在构造目标chunk 1和2,chunk1->bk指向chunk2,chunk2->fd指向chunk1。
2.malloc size 为100的内存victim,初始时fd与bck值为0。
3.malloc size为1000的内存,防止内存victim free时与top紧临而被合并到top区域
4.free victim,进入unsort bin,victim FD与BCK值被改写,指向unsort bin。
5.修改victim bck,指向chunk1,方便后继分配chunk1
6.malloc size为1200的内存,使victim从unsort bin进入small bin队首(产生malloc consolidate),victim fd与bck都发生了改变。注:2.31 free chunk size > 64K时,才会发生malloc consolidate。
这里malloc与free相结合使用。malloc经过tcache、fastbin、smallbin查找chunk不成功,会对fastbin做malloc consolidate,入unsortbin。后面会查找unsortbin,查找相同尺寸的chunk。如果尺寸不同,chunk将放入small/large等bins。
7.修改victim bak,便其向向chunk1。
8.malloc 100,分配victim区域。
9.malloc 100,分配 栈上chunk1。
10.为所欲为。
知识点:_int_free 内存时,先后涉及tcache、fastbin、unsortbin。不会涉及smallbin、largebin。house of lore利用malloc(1200) 将unsortbin的chunk放入到smallbin。
网友评论