实验

实验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_pwn1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include<stdlib.h>
#include <stdio.h>
#include <unistd.h>

char *chunk_list[0x100];

void menu() {
puts("1. add chunk");
puts("2. delete chunk");
puts("3. edit chunk");
puts("4. show chunk");
puts("5. exit");
puts("choice:");
}

int get_num() {
char buf[0x10];
read(0, buf, sizeof(buf));
return atoi(buf);
}

void add_chunk() {
puts("index:");
int index = get_num();
puts("size:");
int size = get_num();
chunk_list[index] = malloc(size);
}

void delete_chunk() {
puts("index:");
int index = get_num();
free(chunk_list[index]);
}

void edit_chunk() {
puts("index:");
int index = get_num();
puts("length:");
int length = get_num();
puts("content:");
read(0, chunk_list[index], length);
}

void show_chunk() {
puts("index:");
int index = get_num();
puts(chunk_list[index]);
}

int main() {
setbuf(stdin, NULL);
setbuf(stdout, NULL);
setbuf(stderr, NULL);

while (1) {
menu();
switch (get_num()) {
case 1:
add_chunk();
break;
case 2:
delete_chunk();
break;
case 3:
edit_chunk();
break;
case 4:
show_chunk();
break;
case 5:
exit(0);
default:
puts("invalid choice.");
}
}
}

题目2_