상세 컨텐츠

본문 제목

[Heap Exploitation] The House of Lore

SYSTEM HACKING/Exploit Tech

by koharin 2020. 1. 15. 14:54

본문

728x90
반응형

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를 할당해준다.

 

 

 

728x90
반응형

관련글 더보기