ii4gsp
[Heap] Double Free Bug 본문
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 |