1. Condition
1. 할당받기 원하는 영역에 fake chunk 구조를 가지고 있어야 한다.
-> malloc()의 smallbins corruption check 우회 위해
2. small chunk, large chunk의 할당과 해제가 자유로워야 한다.
3. freed chunk의 bk 영역에 원하는 값을 저장할 수 있어야 한다.
2. Exploit Plan
1. 공격 대상
- fake chunk 구조 가질 수 있는 memory 영역
- fake chunk 구조 저장할 수 있는 memory 영역
- fake chunk 생성 시 prev_size, size는 신경쓰지 않아도 되고 fd와 bk 값만 제대로 주면 된다.
fd에는 heap 영역에 있는 청크의 bk에 fake chunk 주소가 저장된 청크 주소로 적는다.
- fake chunk를 할당받으려면 최소 2개의 fake chunk가 필요하다.
-> malloc()의 bck->fd != victim 검사 때문에
2. 서로 다른 크기의 2개의 heap 할당
- small bin 2개 ex. malloc(0x80) malloc(0x100)
3. 첫 번째 청크 해제
- 이때 small chunk이므로 일단 unsorted bin에 들어간다.
4. 해제된 첫 번째 청크의 bk 영역에 원하는 영역의 주소 저장
- fake chunk 영역 주소 + 0x10 = bk 영역에 저장할 값
5. 두 번째 청크보다 큰 크기의 청크 할당
- 보통 large chunk ex. malloc(1200)
- large chunk 할당 시 unsorted bin에 등록된 해제된 small chunk를 small bins에 등록할 수 있다.
6. 해제된 청크와 동일한 크기의 heap 2개 할당
- 첫 번째 할당 시 small bin에 등록된 해제된 청크를 할당해준다.
- 두 번째 할당 시 해제된 청크의 bk에 저장된 주소, 즉 fake chunk를 할당해준다.
-> 이때 fake chunk를 할당받을 때 또 malloc()에서 bck->fd != victim 검사를 한다.
따라서 fake chunk 다음에 또 다른 fake chunk를 만들어놔야 해당 조건을 우회하고 fake chunk를 할당받을 수 있다.
3. bck->fd != victim
small bins에 등록된 chunk를 사용할 때 "bck->fd" 와 "victim" 값이 다른지 확인하고 다르면 erro 메시지 출력
즉, small bins에 등록된 첫 번째 청크를 재할당 시 victim은 자기자신, bk->fd는 자기자신이어야 한다.
첫 번째 청크가 small bins에서 할당되면 small bin에 fake chunk가 등록되고 이를 다시 할당받으려면 또 "bck->fd != victim" 검사를 하므로 두 번째 fake chunk가 필요한 것이다.
small bin에 등록된 free chunk의 bk 영역에 두 번째 청크의 fake chunk 주소 저장한다. (victim->bk)
두 번째 fake chunk의 fd에는 첫 번째 fake chunk의 주소를 저장한다. (bck->fd)
4. Example
#include<stdio.h>
#include<stdli.h>
#include<string.h>
int main()
{
char stack[256];
printf("Stack : %p\n", stack);
char *buf1 = malloc(128);
char *buf2 = malloc(256);
printf("buf1 : %p\n", buf1);
printf("buf2 : %p\n", buf2);
free(buf1);
printf("Stack : ");
scanf("%56s", stack);
void *buf3 = malloc(1200);
printf("buf3 : %p\n", buf3);
printf("buf1 : ");
scanf("%16s", buf1);
void *buf4 = malloc(128);
void *buf5 = malloc(128);
printf("buf4 : %p\n", buf4);
printf("buf5 : %p\n", buf5);
printf("buf5 : ");
scanf("%128s", buf5);
return 0;
}
1. 크기 서로 다른 heap 영역 2개 할당
- small chunk(0x80, 0x100)
2. 첫 번째 청크만 해제
- small chunk 해제 시 일단 unsorted bin에 들어간다.
3. 해제된 small chunk를 small bin에 등록하기 위해 large chunk 할당
- large chunk(0x4b0)
4. 해제된 small chunk의 bk에 원하는 주소 저장
5. 해제된 small chunk와 같은 크기의 두 개 청크 할당
- 첫 번째로 해제했던 small chunk 할당해주고, 그러면 fake chunk가 small bin에 등록된다.
두 번째는 small bin에 등록되어 있는 fake chunk를 할당해준다.
[Heap Exploitation] Overlapping Chunks 2 (0) | 2020.01.26 |
---|---|
[Heap Exploitation] Overlapping chunks (0) | 2020.01.17 |
[Heap exploitation] House of Force (0) | 2020.01.12 |
[Heap exploitation] Unsorted Bin Attack (0) | 2020.01.09 |
[Heap Exploitation] unsafe unlink (0) | 2020.01.05 |