1. Condition
1) free chunk를 생성할 수 있어야 한다.
2) free chunk의 size 영역에 값을 저장할 수 있어야 한다.
- size 영역을 변조해서 다음 청크를 overwrite해야 하므로
2. Exploit Plan
1) 3개의 heap 생성
ex. malloc(0x100) malloc(0x100) malloc(0x80)
2) 2번째 heap 영역 해제
- 해제하는 청크는 다음 청크의 다음 청크가 top chunk여야 한다.
- 해제된 chunk는 unsorted bin에 들어간다. (small chunk 이상 사이즈로 할당)
3) free chunk의 size 영역에 재할당 받을 크기 값 저장
- 재할당 받을 크기 값 : 해제된 heap 크기(0x100+0x10) + 3번째 heap 크기(0x80+0x10) + PREV_INUSE(0x1) = 0x1a1
* 첫 번째 청크가 free chunk인 것으로 오해하지 않도록 size 변경 시 PREV_INUSE 비트 값을 1로 설정한다.
4) 할당받기 원하는 크기의 heap 영역 할당
- 할당받기 원하는 크기 : 0x1a0 - 8 = 0x198
- 해제한 청크의 크기와 비슷하므로 unsorted bin에 등록되어 있는 2번째 heap 영역의 시작주소 할당받는다.
* 3번째 영역의 값을 덮어쓸 수 있다.
* malloc() 함수는 변경된 free chunk의 size 값에 의해 다음 chunk가 top chunk를 가리키기 때문에 unlink() 함수가 호출되지 않아서 chunksize(P) @= prev_size (next_chunk(P)) 코드 우회 가능
3. Example
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdint.h>
void main()
{
char *buf1 = malloc(0x100);
char *buf2 = malloc(0x100);
char *buf3 = malloc(0x80);
memset(buf1, 'A', 0x100);
memset(buf2, 'B', 0x100);
memset(buf3, 'C', 0x80);
free(buf2);
int size;
scanf("%272s", buf1);
scanf("%d", &size);
char *buf4 = malloc(size);
scanf("%384s", buf4);
printf("buf3 : %s\n", buf3);
scanf("%128s", buf3);
printf("buf4 : %s\n", buf4);
}
[Heap Exploitation] Poison null byte(Shrink chunk) (0) | 2020.01.30 |
---|---|
[Heap Exploitation] Overlapping Chunks 2 (0) | 2020.01.26 |
[Heap Exploitation] The House of Lore (0) | 2020.01.15 |
[Heap exploitation] House of Force (0) | 2020.01.12 |
[Heap exploitation] Unsorted Bin Attack (0) | 2020.01.09 |