1. Conditions
1) 0x200 이상의 heap 영역 : 공격 대상 heap 영역을 할당, 해제할 수 있어야 한다.
Fast bin 이상의 heap 영역(Heap size : 0x80 이상) : 공격 대상 영역에 할당 heap 영역
2) 공격자에 의해 free chunk의 size 영역의 1바이트를 null로 변경할 수 있어야 한다.
3) 공격자에 의해 free chunk의 size보다 작은 heap 영역을 2개 할당할 수 있어야 한다.
4) 공격자에 의해 free chunk의 size보다 작은 heap 영역 2개를 할당할 수 있어야 한다.
2. Exploit plan
1) 3개의 heap 할당
- heap1(0x80), heap2(0x200), heap3(0x80)
2) heap2의 header의 size 영역에 1바이트(LSB)를 null로 변경한 값을 저장한다.
- chunkaddr + 0x200(size(0x211)에 1바이트를 null로 변경한 값)
- chunksize(P) != prev_size (next_chunk(P)) 우회하기 위해 줄어든 size만큼 다음 청크의 fake prev_size를 만든다.
3) heap2 영역 해제
4) free chunk의 size 영역에 1바이트(LSB)를 null로 변경한 값을 저장한다.
- 0x211 -> 0x200
5) 변경된 free chunk 영역 안에서 생성 가능한 크기의 heap 영역 2개 할당
- heap4(0x80), heap5(0x80)
6) heap4 영역 해제
- 세 번째 청크 해제 시 이전청크와 합쳐지면서 unlink() 함수가 호출되므로 fd, bk가 설정되어있어야 하기 때문이다.
7) heap3 영역 해제
8) “heap4 크기+heap5 크기” 이상의 heap 영역 할당
- 할당받은 영역으로 인해 heap5 영역의 값 덮어쓸 수 있다.
3. Example (Lazenca Example 요약)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdint.h>
#include<malloc.h>
int main()
{
char *buf1 = malloc(0x80);
char *buf2 = malloc(0x200);
char *buf3 = malloc(0x80);
scanf("%512s", buf2);
free(buf2);
scanf("%136s", buf1);
char *buf4 = malloc(0x80);
char *buf5 = malloc(0x80);
memset(buf5, 'A', 0x80);
free(buf4);
free(buf4);
char *buf6 = malloc(0x280);
memset(buf6, 'B', 0x280);
}
1) 3개의 heap 영역 할당
malloc(0x80) : 0x602010
malloc(0x100) : 0x6020a0
malloc(0x80) : 0x6022b0
2) heap2의 헤더 size 값 변경 (heap2에 입력받음)
- Fake prev_size 주소 : buf2의 header 주소(0x602090) + (buf2 header의 size(0x211) & null byte(0xff00)) = 0x602290
- Fake prev_size 값 : buf2 header의 size(x211) & null byte(0xff00) = 0x200
3) heap2 해제
4) heap1 영역에 데이터 입력
Free chunk의 size 영역에 1바이트(LSB)를 null byte로 바꿀 수 있다.
- heap1 영역에 데이터 입력
- heap2 free chunk의 size 값이 0x211에서 0x200으로 변경됨
5) heap4, heap5 할당
- 할당받은 heap4, heap55 영역은 해제된 heap2 영역 내에서 할당된다.
- 할당된 영역 : 0x6020a0(heap4), 0x602130(heap5)
6) heap5 영역에 ‘A’*0x80 저장
7) heap4 영역 해제
- free chunk 값에 변화가 생긴다.
- heap4 free chunk의 fd : 0x6021b0
- 0x6021b0 free chunk의 bk : 0x602090
8) heap3 영역 해제
- top chunk 영역이 변경된다.
- top chunk 영역 : 0x602098
-top chunk 영역이 변경된 이유 : heap3 의 prev_size 값이 0x210이기 때문에 0x6021b8에 otp chunk가 생성되지 않는다.
-heap3 이전 chunk 위치 : heap3의 allocated chunk address(0x6022a0) – heap3의 prev_size(0x210) = 0x602090
9) heap5 영역 덮어쓰는 heap6 영역 할당
- 할당받은 영역 : 0x6020a0
- 크기 : 0x290(헤더 포함)
[Back to Basic] Linux exploitation & Mitigation #1 (0) | 2020.04.06 |
---|---|
[Exploit Tech] Return to dl resolve (0) | 2020.02.21 |
[Heap Exploitation] Overlapping Chunks 2 (0) | 2020.01.26 |
[Heap Exploitation] Overlapping chunks (0) | 2020.01.17 |
[Heap Exploitation] The House of Lore (0) | 2020.01.15 |