공격조건
해제된 힙의 size를 조작할 수 있을 때
glibc 2.27 미만
Overlapping chunks란?
해제된 힙의 size를 기존 힙 청크의 크기보다 큰 값으로 조작하고 할당하면 다른 힙 청크의 영역을 침범하여 메타데이터를 덮어 쓸 수 있다.
해당 기법은 두 가지 방법이 있다.
방법 1
할당하려는 크기가 unsorted bin에 들어간 힙 청크의 크기와 같으면 해당 주소를 재사용하여 할당하는 unsorted bin의 특징을 이용한다.
방법 2
해제된 힙의 특징을 이용한다.
예(방법 1)
#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);
}
코드를 보면 우선 0x100을 3번 할당하고 첫 번째 chunk를 해제한다. 그리고 해제된 chunk에 접근하여 size를 0x211로 바꿔버린다. 그리고 0x200 크기로 할당하면 크기에 맞는 chunk인 ptr1을 재할당하고 크기가 0x200이기에 ptr2를 overlapping해버린다.
예(fast bin)(방법 2)
fastbin의 경우에는 조작한 크기만큼 떨어진 영역에 다른 힙 청크의 메타데이터가 존재하지 않으면 free():invalid next size (fast) 에러를 출력하고 종료한다. 그래서 조작을 할 때 알맞은 크기로 조작을 해야 한다.
#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);
}
<틀린 부분이 있다면 비난과 욕설을 해주세요>
'포너블 > Heap' 카테고리의 다른 글
House of Spirit (0) | 2023.11.27 |
---|---|
Large Bin Attack (1) | 2023.11.22 |
unsorted bin attack & memory leak (0) | 2023.11.18 |
fastbin dup, fastbin dup consolidate & Unsafe unlink (0) | 2023.11.18 |
double free (0) | 2023.11.07 |