实验

实验1

  • 可以修改size位,使得堆块被放入不同的tcache中。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// gcc -g -o lab1 lab1.c
#include<stdio.h>
#include<malloc.h>
int main()
{
unsigned long long int *p[10];
int i;
for(i=0;i<10;i++)
{
p[i] = malloc(0x30);
}
p[1][-1] = 0x71; //模拟堆溢出漏洞,将堆块的size位给修改了
free(p[1]);
return 0;
}
  • 先申请10个堆块,这10个堆块的size位都是0x40

image-20250715172117689

  • 之后我们修改p[1]指向的堆块中的size位修改为0x71

image-20250715172302970

  • 这时我们free后就会出现如下现象:chunk原本应该被放入0x40大小下的tcache中,但是释放后却被放入到了0x70大小的tcache中。

image-20250715172544452

实验2

  • 可以修改size位,并且进行堆块的伪造,可以触发unlink或者是将堆块放入unsortedbin等其他bins中。这个其实在tcache_unlink中的内容,但是也算是对house of kauri进行一点扩展吧。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// gcc -g -o lab2 lab2.c
#include<stdio.h>
#include<malloc.h>
int main()
{
unsigned long long int *p[10];
int i;
for(i=0;i<10;i++)
{
p[i] = malloc(0xf0);
}
p[1][-1] = 0x4f1; //模拟堆溢出漏洞,将堆块的size位给修改了
free(p[1]);
return 0;
}

题目1_