Post

unsorted bin attack

https://github.com/shellphish/how2heap/blob/master/unsorted_bin_attack.c

unsorted bin에 있는 chunk가 할당될 때, 역시 unsorted bin에서 chunk를 제거하기 위해 unlink가 일어난다.

단, 여기서는 unlink macro를 사용하지 않고 처리한다.

[malloc] unsorted bin size check [malloc] unsorted bin unlink

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
for (;; )
{
int iters = 0;
while ((victim = unsorted\_chunks (av)->bk) != unsorted\_chunks (av))
{
bck = victim->bk;
if (\_\_builtin\_expect (chunksize\_nomask (victim) <= 2 \* SIZE\_SZ, 0)
|| \_\_builtin\_expect (chunksize\_nomask (victim)
> av->system\_mem, 0))
malloc\_printerr (check\_action, "malloc(): memory corruption",
chunk2mem (victim), av);
size = chunksize (victim);

  

......

  

/\* remove from unsorted list \*/
unsorted\_chunks (av)->bk = bck;    // bck == victim->bk == &stack\_var - 2
bck->fd = unsorted\_chunks (av);    // (&stack\_var - 2)->fd == stack\_var

  

......

결과적으로 stack_var = &av->bins[0] 가 대입된다.

size check를 제외하면 별 다른 check가 없기 때문에 unlink처럼 victim->fd/bk 값을 컨트롤하지 않아도 돼서 해당 영역의 fd/bk 컨트롤 가능 여부에 관계없이 아무데나 victim을 설정할 수 있지만,

쓰게 되는 값은&av->bins[0] 으로 고정이라는 점이 큰 단점이다.

따라서, 주로 global\_max_fast 같은 설정 변수를 큰 값으로 변경하고자 할 때 사용하게 된다.

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