Double Free Bug
Double Free Bug(DFB)는 free(ptr1); free(ptr1);처럼 같은 메모리를 여러번 free했을 때 나타나는 버그이다. 이게 왜 문제인지는 아래에서 설명할 것임
free(ptr1);
free(ptr1);
free 함수는 포인터를 초기화하지 않는다. 따라서 free를 여러번 하게 되면, freelist에 동일한 주소가 여러번 적히게 된다.(free는 freelist에 노드를 '추가'하는 것과 같다)
원래는 위 코드처럼 연달아 해도 아무 문제 없었는데, freelist에서 연속한 청크가 같은 주소이면(ptr1->ptr1 이런식으로 리스트가 연결되면) 에러 내뿜고 죽는다.
그래서 아래처럼 해주면 우회할 수 있다.
free(ptr1);
free(ptr2);
free(ptr1);
이러면 ptr1->ptr2->ptr1 순으로 되어 ptr1들이 연달아 있지 않아 에러가 안난다.
에러 나는 원리는 요렇다.
// old는 이전에 해제한 청크 포인터, p는 현재 해제할 청크 포인터
if (__builtin_expect (old == p, 0) //바로 전에 해제한 포인터와 현재 포인터랑 같으면 에러 내뿜음
{
errstr = "double free or corruption (fasttop)";
goto errout;
}
아니 근데 솔직히 왜 이렇게 패치를 한건지 잘 이해가 안간다.. freelist 전체에서 중복된 원소 있는지 검사해야하는 거 아님? 왜 바로 전만 같은지 검사함..? ㅠ
암튼 이게 왜 문제인지를 코드를 통해 살펴보자
// gcc -o dfb2 dfb2.c
#include <stdlib.h>
int main()
{
char *ptr = malloc(32); // 0x602010
char *ptr2 = malloc(32); // 0x602030
free(ptr);
free(ptr2);
free(ptr);
return 0;
}
위처럼 free를 하게 되면 freelist는 0x602010->0x602030->0x602010 순으로 구성되게 된다.
만약 이 상태에서 32짜리 청크 할당을 요청했다고 생각해보자.
char *ptr3 = malloc(32);
fastbin은 LIFO를 이용하므로 가장 최근에 해제된 0x602030 (위 그림에서 가장 왼쪽)을 재할당할 것이다. (사이즈 똑같으니까 ㅇㅇ)
gdb-peda$ heapinfo
..
(0x30) fastbin[1]: 0x602000 --> 0x602030
그럼 heapinfo 찍어보면 이렇게된다.
아무튼 우리는 ptr4을 통해 0x602030에 접근할 수 있게된다. 그렇다면 재할당을 통해 얻은 청크의 포인터(ptr4)를 통해 접근하여 해당 청크의 내용을 수정하면, freelist에 적혀있는 청크의 정보도 수정될 것이다. (fastbin에 0x602030이 남아있으니까!)
따라서 DFB를 통해 freelist 안의 청크 정보를 수정할 수 있다.
free 청크에서 fd,bk 부분은 allocated chunk의 데이터 부분에 해당한다. 따라서 ptr3를 통해 청크의 데이터부분(그런데 fd,bk 위치)를 수정하면 fd나 bk를 조작할 수 있을 것이다. 그러면 bin을 이루는 연결리스트의 구조도 수정할 수 있게된다. (예를 들어 fd를 우리가 원하는 주소로 덮으면, fastbin에 그 주소로 연결이 되게찌) 이래서 문제가 되는 거다. 우리가 맘대로 bin 안의 리스트 구조를 바꿀 수 있으니까!
fastbin에서 DFB가 일어나서 이를 공격하는 기법([Heap] Exploitation : fastbin dup & poisoning), tcache에서 DFB가 일어나서 이를 통해 공격하는 기법(tacache dup & poisoning)에 따라 공격 방법이 달라지는데 이는 다른 포스트에서 다루도록 하겠다.
'Linux Exploitation > Heap' 카테고리의 다른 글
[Heap] Exploitation : fastbin dup & poisoning (1) | 2023.06.16 |
---|---|
[Heap] Exploitation : Poison NULL Byte (0) | 2023.06.15 |
[Heap] Exploitation : Unsorted Bin Memory Leak (0) | 2023.06.11 |
[Heap] Background : Bin (Fastbin, Unsorted bin, Small bin, Large bin) (1) | 2023.06.09 |
[Heap] Background : Chunk (3) | 2023.06.07 |