상세 컨텐츠

본문 제목

[Heap Exploitation] Overlapping chunks

SYSTEM HACKING/Exploit Tech

by koharin 2020. 1. 17. 12:14

본문

728x90
반응형

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);
}

 

 

728x90
반응형

관련글 더보기