Heap Spray

728x90

요약

Heap 영역을 확장하며 해당 영역에 특정 값으로 가득 채우는 기술

Heap Spray로 인해 대부분의 아키텍처에서 대규모 Heap이 할당되는 시작 위치 예측 가능

Heap spray는 응용 프로그램에서 Heap 영역의 값을 읽어 해당 주소도 이동하는 함수 포인터를 덮어쓸 수 있는 취약성이 있을 경우에 사용

Heap Feng shui에도 사용됨

Heap 전체에 내가 원하는 코드를 골고루 위치시켜서 예측 가능한 공간에 Payload를 구성하기 위한 기법

 

예제

예제 코드

//g++ -o heapspray heapspray.cpp -ldl
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <cstring>
#include <dlfcn.h>
 
class UAF {
    char memo[160];
 
public:
    UAF(char *memo) {
        strncpy(this->memo,memo,strlen(this->memo));
    }
 
    virtual void target() {
        write(1, this->memo, strlen(this->memo));
    }
};
 
void heapSpray(){
    int size;
    char *data;
 
    printf("Input size:\n");
    read(0, &size, 4);
    if (size > 0) {
        printf("Input contents:\n");
        data = new char[size];
        read(0, data, size);
    }
}
 
int main(){
    char memo[160] = {};
 
    void *printf_addr = dlsym(RTLD_NEXT, "printf");
    printf("Printf() address : %p\n",printf_addr);
 
    printf("Heap spray!\n");
    while(1){
        char status[2];
        heapSpray();
        printf("Will you keep typing?(No:0):\n");
        read(0,&status,2);
 
        if(atoi(status) == 0)
            break;
    }
 
    printf("Create vtable\n");
    read(0, memo, sizeof(memo));
 
    UAF *uaf = new UAF(memo);
    delete uaf;
 
    printf("UAF!\n");
    heapSpray();
 
    uaf->target();
 
    return 0;
}

분석

1. dlsym함수를 사용하여 공유 라이브러리에서 printf함수의 symbol 값을 찾음

2. heapSpray함수를 실행하여 size 값을 입력 받음

3. 입력받은 size값 만큼 new를 이용하여 Heap할당하고 값 입력받음

4. UAF Class 생성

5. UAF Class 삭제

6. heapSpray함수 실행

7. uaf -> target함수 실행

 

size에 100을 입력, 터미널이라 문자열로 들어가 값을 직접 변경해야함
set $rdi = 100
heapSpray()안에 있는 data부분에 AAAA를 넣고 vtable 생성

 

정상적으로 값이 잘 들어감
rsi의 값은 Create vtable에서 입력해줬던 100
터미널에서 입력했기 때문에 문자열로 입력되어 숫자로 변경

'rax' - 가장 중요한 레지스터로 시스템 콜의 실질적 번호를 가리키는 번호, 함수 결과값이 담기는 레지스터

'rbx' - base register로 메모리 주소를 지정할 때 사용

 

해당 코드에서는 UAF 취약점이 있음.

UAF 클래스가 삭제된 후 HeapSpray함수를 이용해서 UAF 클래스와 동일한 크기의 heap 영역을 할당 받으면 UAF 취약성이 발생

이러한 취약점을 이용해 쉘 획득 가능

Heap spray를 이용해 Heap 영역을 One Gadget 주소로 채움 -> UAF 취약성으로 할당 받은 영역에 Heap spray된 heap 주소를 유추하여 저장 -> 이로 인해 "uaf→target()" 코드는 heap spray된 영역에 저장된 One gadget 주소를 target() 함수의 시작 주소로 판단하고 실행

앞서 할당한 크기와 동일크기 입력
AAAABBBBCCCCDDDD 입력후 스택
값이 제대로 들어감

 

출처: https://www.lazenca.net/display/TEC/11.Heap+Spray 

 

11.Heap Spray - TechNote - Lazenca.0x0

Excuse the ads! We need some help to keep our site up. List Heap Spray Heap spray란 Heap 영역을 확장하면서 해당 영역에 특정 값으로 가득 채우는 기술입니다.Heap spray를 이용해 Exploit의 성공 가능성을 높이기 위해

www.lazenca.net

 

728x90

'Technique' 카테고리의 다른 글

pwntools에서 debug 및 ld_preload 사용법  (0) 2021.10.06
레지스터 종류  (0) 2021.10.02
PIE 디버깅  (0) 2021.07.25
SROP  (0) 2021.07.25
IO_FILE_Vtable overwrite  (0) 2021.07.25