ii4gsp

[Heap] Double Free Bug 본문

시스템 해킹/Technique

[Heap] Double Free Bug

ii4gsp 2020. 1. 20. 20:46

Dobule Free Bug 줄여서 DFB라고 부른다.

Heap을 할당할 때 할당된 영역의 크기는 요청한 사이즈보다 더 크다.

 

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

int main()
{
    char *a, *b, *c;

    a = malloc(0x20);
    b = malloc(0x20);
    c = malloc(0x20);

    strcpy(a, "AAAAAAAA");
    strcpy(b, "BBBBBBBB");
    strcpy(c, "CCCCCCCC");

    printf("a = %p\n", a);
    printf("b = %p\n", b);
    printf("c = %p\n", c);

    free(c);
    free(b);
    free(a);

    return 0;
}

프로그램을 실행시켜보자

 

 

0x20만큼 메모리를 세 번 할당했지만 할당된 영역의 주소의 차이는 0x28만큼 난다.

동적 메모리가 할당 될 때 해당 메모리에 대한 정보들이 포함되기 때문이다.

 

 

struct malloc_chunk {
  INTERNAL_SIZE_T      prev_size;  /* Size of previous chunk (if free).  */
  INTERNAL_SIZE_T      size;       /* Size in bytes, including overhead. */

  struct malloc_chunk* fd;         /* double links -- used only if free. */
  struct malloc_chunk* bk;

  /* Only used for large blocks: pointer to next larger size.  */
  struct malloc_chunk* fd_nextsize; /* double links -- used only if free. */
  struct malloc_chunk* bk_nextsize;
};

할당된 메모리의 정보들은 pre_size, size, fd, bk, fd_next_size, bk_nextsize가 있다.

 

pre_size: 이전의 chunk가 free되면 설정되는 값 (플래그를 제외한 이전 chunk의 크기)

 

size: 현재 chunk의 크기 정보

chunk는 8바이트 단위로 정렬되는데, 하위 3비트는 플래그 용도로 쓰인다.

 

fd: 이전 chunk의 주소값

 

bk: 다음 chunk의 주소값

 

fd와 bk는 unsorted chunk list에서 사용되어 지는 값들이다.

chunk가 동적 할당되고 해제될때 unsorted chunk list에 들어간다.

 

 

#define unlink( P, BK, FD ) {
    BK = P->bk;
    FD = P->fd;
    FD->bk = BK;
    BK->fd = FD;
}

Double Free Bug는 free() 함수의 실행을 바탕으로 unlink매크로를 이용한 공격법이다.

chunk가 해제되면 unsorted chunk list에 들어간다고 하였다.

bin이라는 구조를 사용하여 해제된 chunk list를 관리하는데, 이 것을 bin 구조라고 한다.

리스트안에서 fd와 bk에 의하여 각각의 chunk들은 서로 연결되어 있는 상태이다.

fd와 bk를 변경하여 중간의 chunk 제거가 가능하다.

 

chunk가 해제되었을 때, 역속된 위치의 다른 chunk가 해제되어 있다면 두 chunk를 합병하여 하나로 만들어준다.

이때 chunk의 사이즈가 증가하기 때문에 원래 속해있던 bin리스트에서 해당 chunk를 제거하고, 다시 적절한 bin 리스트에 넣어줘야한다.

 

unlink매크로가 발생하면 fd + 12 = bk, bk + 8 = fd 로, 원하는 주소에 원하는 값을 입력할 수 있다.

'시스템 해킹 > Technique' 카테고리의 다른 글

RTL (Return-to-libc) 기법  (2) 2020.01.22
FPO (Frame Pointer Overflow) 기법  (0) 2020.01.21
[Heap] Use After Free  (0) 2020.01.20
[Heap] Buffer Overflow  (3) 2020.01.19
SEH Overwrite 기법  (0) 2020.01.15
Comments