0x001
1 | char* a = malloc(0x18); |
接上1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
250x602050 FASTBIN {
prev_size = 0x0,
size = 0x31,
fd = 0x0,
bk = 0x0,
fd_nextsize = 0x0,
bk_nextsize = 0x0
}
0x602080 FASTBIN {
prev_size = 0x0,
size = 0x41,
fd = 0x0,
bk = 0x0,
fd_nextsize = 0x0,
bk_nextsize = 0x0
}
0x6020c0 PREV_INUSE {
prev_size = 0x0,
size = 0x20f41,
fd = 0x0,
bk = 0x0,
fd_nextsize = 0x0,
bk_nextsize = 0x0
}
pwndbg>
所以说申请0x19 ~ 0x28大小的内存都是返回0x30大小的chunk
0x19是多分配了,0x
1 | free(a); |
1 | char* a = malloc(0x8); |
但是这里哪怕是申请0x8的大小也会分配0x10而不是0x8的数据域大小不像上面
所以0x00~0x18都是分配0x20大小的chunk,有点特殊
| ApplicationSize | returnSize |
|---|---|
| 0x00~0x18 | 0x20 |
| 0x09~0x28 | 0x30 |
| 0x29~0x38 | 0x40 |
| 0x39~0x48 | 0x50 |
| 0x49~0x58 | 0x60 |
| 0x59~0x68 | 0x70 |
| 0x69~0x78 | 0x80 |
0x02 chunksize>=maxfast且与top_chunk相邻,释放的时候,触发了fastbins的合并
1 |
|
1 | free(a); |
1 | free(d); |
这里当chunk的大小大于0x78后在释放,并不会被放到fastbins中,而且整个堆都没了被合并了,
但是unsorted bins中也没看见咧、、、、
会跟跟top_chunk合并???
0x0x3 chunksizr<=fast_max且与top_chunk相邻,释放时的情况
再试一下下面这个看看top_chunk合并1
2
3
4
5
6 char* a = malloc(0x68);
char* b = malloc(0x69);
char* c = malloc(0x78);
free(a);
free(b);
free(c);
这里与seebug上说的不一致咧
判断 chunk 的大小和所处的位置, 若 chunk_size <= max_fast, 并且 chunk 并不位于 heap 的顶部, 也就是说并不与 Top chunk 相邻, 则转到下一步, 否则跳到第 5 步.(因为与 top chunk 相邻的 chunk(fastbin) ,会与 top chunk 进行合并, 所以这里不仅需要判断大小, 还需要判断相邻情况)
上为seebug原话,现在这个chunk c大小是等于maxfast但是他与top_chunk相邻。
但是这里把 c free掉之后并没有与top_chunk合并,
还是这样丢到fastbins里面去了
不明白!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
52pwndbg> heap
Top Chunk: 0x602170
Last Remainder: 0
0x602000 FASTBIN {
prev_size = 0x0,
size = 0x71,
fd = 0x0,
bk = 0x0,
fd_nextsize = 0x0,
bk_nextsize = 0x0
}
0x602070 FASTBIN {
prev_size = 0x0,
size = 0x81,
fd = 0x0,
bk = 0x0,
fd_nextsize = 0x0,
bk_nextsize = 0x0
}
0x6020f0 FASTBIN {
prev_size = 0x0,
size = 0x81,
fd = 0x602070,
bk = 0x0,
fd_nextsize = 0x0,
bk_nextsize = 0x0
}
0x602170 PREV_INUSE {
prev_size = 0x0,
size = 0x20e91,
fd = 0x0,
bk = 0x0,
fd_nextsize = 0x0,
bk_nextsize = 0x0
}
pwndbg> bins
fastbins
0x20: 0x0
0x30: 0x0
0x40: 0x0
0x50: 0x0
0x60: 0x0
0x70: 0x602000 ◂— 0x0
0x80: 0x6020f0 —▸ 0x602070 ◂— 0x0
unsortedbin
all: 0x0
smallbins
empty
largebins
empty
pwndbg>
0x04 chunksize>=maxfast但不予与top_chunk相邻,释放的时候,没有触发fastbins的合并,他也被丢到unsorted_bin里了。
1 | char* a = malloc(0x78); |
1 | char* a = malloc(0x78); |
1 | free(a); |
Bins 本身就是一个数组, 每一个存放的是一个对应长度的 chunk 双向环链表的头结点和尾节点。
1 | free(c); |