fastbin_dup_into_stack
fastbin_dup_into_stack
通过fastbin达到,任意地址,任意写的功能
这里我精简大量的解释代码,换成注释方便调试
#include <stdio.h>
#include <stdlib.h>
int main()
{
unsigned long long stack_var; //定义一个stack_var变量,存放在栈
fprintf(stderr, "The address we want malloc() to return is %p.\n", 8+(char *)&stack_var);
// &stack_var +8 是我们想要malloc到的返回地址
int *a = malloc(8);
int *b = malloc(8);
int *c = malloc(8);
free(a);
//free(a); 如果我们直接free掉两次a,因为a是fastbin的top,程序会crash
free(b);
free(a);
//--------------------------------------------------------------------------------------
// fastbin(LIFO) : a->b->a 有的可能是tcachebins,不影响实验的结果,不做赘述,可以私下了解
//--------------------------------------------------------------------------------------
//LIFO:后进先出
unsigned long long *d = malloc(8);
//定义一个指针变量 d存放着 malloc申请的地址,同样也是我们fastbin中的a
//--------------------------------------------------------------------------------------
//malloc a fastbin: b ->a->b
//--------------------------------------------------------------------------------------
//这里多一句废话,为什么又a->b了,因为第二次free掉a时,a指向b,连着也会修改第一次free掉a的fd
/**
* 真的可能会照成死循环
*/
malloc(8); //申请掉b
//--------------------------------------------------------------------------------------
//fastbin: a ->b
//--------------------------------------------------------------------------------------
stack_var = 0x20;
//
*d = (unsigned long long) (((char*)&stack_var) - sizeof(d));
//获取stack_var的地址 - sizeof(d) 栈的地址从高到底生长,这里是栈中stack_var地址的下一个地址
//赋值给d指针指向的a的fd
//--------------------------------------------------------------------------------------
//fastbin: a -> &stack_var) - sizeof(d))
//--------------------------------------------------------------------------------------
fprintf(stderr, "3rd malloc(8): %p, putting the stack address on the free list\n", malloc(8));
fprintf(stderr, "4th malloc(8): %p\n", malloc(8)); //成功控制栈空间
}
三次 free之后的链表

unsigned long long *d = malloc(8);

malloc(8)

我们的d指针,所指向的地址时时第一次申请的A chunk
此时,我们可以控制fastbin中A的fd、bk
,链表是fastbin是通过fd来确定下一个fastbin的位置的

fastbin死循环
lude<stdlib.h>
void main(){
int *a = malloc(8);
int *b = malloc(8);
int *c = malloc(8);
free(a);
free(b);
free(a);
malloc(8);
malloc(8);
malloc(8);
malloc(8);
malloc(8);
}

白茶清欢无别事,我在等风也等你。

浙公网安备 33010602011771号