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之后的链表
75bb4b513d34781ddcc34d3cc4e90402.png
unsigned long long *d = malloc(8);
0b5a757e72e4a65abcb0bbf74197ae32.png
malloc(8)
2f656438db9a5cf8c539be5f68d487a0.png
我们的d指针,所指向的地址时时第一次申请的A chunk
此时,我们可以控制fastbin中A的fd、bk
,链表是fastbin是通过fd来确定下一个fastbin的位置的
a712aaf31b1604643bb59cdd25682a1d.png


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);
}

43fbd26756fe67c6996b807600d35e59.png


posted @ 2020-03-14 21:43  zlisang  阅读(313)  评论(0)    收藏  举报