상세 컨텐츠

본문 제목

[Heap Exploitation] Poison null byte(Shrink chunk)

SYSTEM HACKING/Exploit Tech

by koharin 2020. 1. 30. 22:05

본문

728x90
반응형

1. Conditions

 

1) 0x200 이상의 heap 영역 : 공격 대상 heap 영역을 할당, 해제할 수 있어야 한다.

Fast bin 이상의 heap 영역(Heap size : 0x80 이상) : 공격 대상 영역에 할당 heap 영역

 

2) 공격자에 의해 free chunksize 영역의 1바이트를 null로 변경할 수 있어야 한다.

 

3) 공격자에 의해 free chunksize보다 작은 heap 영역을 2개 할당할 수 있어야 한다.

 

4) 공격자에 의해 free chunksize보다 작은 heap 영역 2개를 할당할 수 있어야 한다.

 

 

2. Exploit plan

 

1) 3개의 heap 할당

- heap1(0x80), heap2(0x200), heap3(0x80)

 

2) heap2headersize 영역에 1바이트(LSB)null로 변경한 값을 저장한다.

- chunkaddr + 0x200(size(0x211)1바이트를 null로 변경한 값)

- chunksize(P) != prev_size (next_chunk(P)) 우회하기 위해 줄어든 size만큼 다음 청크의 fake prev_size를 만든다.

 

3) heap2 영역 해제

 

4) free chunksize 영역에 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 주소 : buf2header 주소(0x602090) + (buf2 headersize(0x211) & null byte(0xff00)) = 0x602290

- Fake prev_size : buf2 headersize(x211) & null byte(0xff00) = 0x200

 

3) heap2 해제

 

4) heap1 영역에 데이터 입력

Free chunksize 영역에 1바이트(LSB)null byte로 바꿀 수 있다.

- heap1 영역에 데이터 입력

- heap2 free chunksize 값이 0x211에서 0x200으로 변경됨

 

5) heap4, heap5 할당

- 할당받은 heap4, heap55 영역은 해제된 heap2 영역 내에서 할당된다.

- 할당된 영역 : 0x6020a0(heap4), 0x602130(heap5)

 

6) heap5 영역에 ‘A’*0x80 저장

 

7) heap4 영역 해제

- free chunk 값에 변화가 생긴다.

- heap4 free chunkfd : 0x6021b0

- 0x6021b0 free chunkbk : 0x602090

 

8) heap3 영역 해제

- top chunk 영역이 변경된다.

- top chunk 영역 : 0x602098

-top chunk 영역이 변경된 이유 : heap3 prev_size 값이 0x210이기 때문에 0x6021b8otp chunk가 생성되지 않는다.

-heap3 이전 chunk 위치 : heap3allocated chunk address(0x6022a0) heap3prev_size(0x210) = 0x602090

 

9) heap5 영역 덮어쓰는 heap6 영역 할당

- 할당받은 영역 : 0x6020a0

- 크기 : 0x290(헤더 포함)

 

 

 

728x90
반응형

관련글 더보기