본문 바로가기
Pwnable/Techniques

Overlapping chunks

by Anatis 2021. 3. 3.

Overlapping chunks 기법은 해제된 힙의 size를 조작할 수 있을 때 사용할 수 있는 기법이다. 해제된 힙의 size를 기존 힙 청크의 크기보다 큰 값으로 조작하고 할당하면 다른 힙 청크의 영역을 침범하여 메타데이터를 덮어쓸 수 있다.

 

이 기법은 두 가지의 방법으로 사용 가능하다.

 

1. 할당하려는 크기가 unsorted bin에 들어간 힙 청크의 크기와 같으면 해당 주소를 재사용하여 할당하는 unsorted bin의 특징을 이용한다.

 

2. 해제된 힙의 특징을 이용한다.

 

overlap1.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>

int main(int argc, char *argv[])
{
    uint64_t *ptr1, *ptr2, *ptr3;
    uint64_t over_ptr;

    ptr1 = malloc(0x100);
    ptr2 = malloc(0x100);
    ptr3 = malloc(0x100);

    free(ptr1);
    ptr1[-1] = 0x211;

    over_ptr = malloc(0x200);
    memset(over_ptr, 0x41, 0x200);
}

overlap1.c는 unsorted bin의 특징을 이용하여 다른 힙 영역을 덮어쓰는 예제이다. 0x100 크기로 할당한 힙을 해제하고 0x110 값을 갖고 있던 size를 0x211로 조작하였다. 

 

이후 조작한 크기로 힙을 할당하고 memset 함수로 A를 할당한 크기만큼 초기화 했다.

할당 요청이 들어왔을 때 unsorted bin에 존재하는 힙 청크의 size와 할당 요청된 크기를 비교하여 같거나 작을 경우 해당 영역을 재사용 하게 된다.

 

해제된 힙의 기존 크기보다 큰 크기의 힙이 해당 영역을 재사용 하며서 다른 힙 청크를 침범한다.

 

overlap2.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>

int main(int argc, char *argv[])
{
    uint64_t *ptr1, *ptr2, *ptr3;
    uint64_t over_ptr;

    ptr1 = malloc(0x20);
    ptr2 = malloc(0x20);
    ptr3 = malloc(0x20);

    ptr1[-1] = 0x61;
    free(ptr1);

    over_ptr = malloc(0x50);
    memset(over_ptr, 0x41, 0x50);
}

overlap2.c는 0x20 크기의 힙을 할당하고 힙을 해제하기 전, ptr1의 size를 0x61로 조작한 후 해제한다.

 

fastbin 크기의 힙을 할당할 때 중요한 것은 조작한 크기만큼 떨어진 영역에 다른 힙 청크의 메타데이터가 존재해야 한다. 존재하지 않을 경우 "free(): invalid next size (fast)" 에러를 출력하고 비정상 종료한다.

 

조작하기 전의 힙 레이아웃이다. 0x602030 주소에 존재하는 힙 영역을 침범하기 위해서는 0x602060 주소까지의 간격을 계산해서 size를 조작해야한다.

 

0x602060 - 0x602000은 0x60이다. 첫 번째 힙의 size를 0x61로 조작하고 해제한 후, 해당하는 bin의 크기로 할당하면 0x602000 + 0x60 위치에 힙 메타데이터가 존재하기 때문에 에러가 발생하지 않는다.

ptr1의 size를 0x61로 조작하고 해제하면서 해제된 힙의 0x60 크기의 bin에 들어간 것을 확인할 수 있다.

 

이후 해당 bin의 크기에 맞는 할당 요청이 들어오면 다른 힙 영역을 침범할 수 있다.

overlapping chunks는 다른 힙 영역의 메타데이터를 덮어씀으로써 다른 공격 기법으로 연계할 수 있다.

'Pwnable > Techniques' 카테고리의 다른 글

Largebin Attack  (0) 2021.03.08
Poison NULL Byte  (0) 2021.03.03
Unosrted bin attack  (0) 2021.03.03
Memory Leak  (0) 2021.03.03
Unsafe unlink  (0) 2021.03.01

댓글