Post

fastbin attack / fastbin\_dup

fastbin attack

free’d fast chunk의 fdfake_chunk addr로 overwrite. 다음 malloc(fast)때 overwrited fast chunk가 반환되면서 fastbin에 ` fake_chunkaddr이 추가되므로, 그 다음 반환 chunk는 fake_chunk`.

1
2
3
4
5
6
7
8
9
10
11
12
13
fake\_chunk[1] = FAST;    // bypass check

  

hptr = malloc(FAST);
victim = malloc(FAST);
free(victim);
strcpy(hptr, argv[1]);  // vulnerability ( overflow, uaf, overlap, fastbin\_dup... )

  

victim = malloc(FAST);  // return victim
fake = malloc(FAST);  // return fake\_chunk
limitation

[malloc] fastbins size check 에 걸리기 때문에 fake_chunk 에는 속해있는 fastbin 집단과 일치하는 size가 설정되어야 한다.

* 속해있는 fastbin 집단의 size와 일치하지 않으면 malloc(): memory corruption (fast) 에러가 발생한다. * 단, align된 단위로 보기 때문에 align 범위 내의 값이면 어떤 값이 와도 상관없다. flag도 마찬가지로 상관 없음.

fastbin_dup

두 번 연속해서 같은 포인터를 free하는 경우[free] double free check 에 걸리지만, 이는 가장 최근 반환 chunk가 다시 free()되는지만 검사하기 때문에 다음과 같은 상황에서 발생하는 overlap을 이용해fastbin attack 을 시도할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
void \*a = malloc(SIZE);
void \*b = malloc(SIZE);
free(a);
free(b);
free(a);

  

a1 = malloc(SIZE);    // a1
malloc(SIZE);    // b
a1 = &fake\_chunk;
malloc(SIZE);    // a2
malloc(SIZE);    // fake\_chunk

이렇게 되면 linked list는 fastbin -> a -> b -> a -> b...로 구성되기 때문에 a1, b, a2 chunk가 순서대로 반환된다.

원래는 a1 chunk의 fd가 0으로 초기화 되면서 a2 까지만 반환되지만 a2 를 할당하기 전에 a1을 이용해 데이터를 쓰는 경우, fd자리에 있는 데이터를 fd로 인식하기 때문에 이후 a2를 할당하면서 fd에 있는 데이터가 fastbin에 들어가게 되고 그 다음 malloc() 때 그 데이터를 위치로 하는 chunk가 반한된다.

This post is licensed under CC BY 4.0 by the author.