[Heap] UAF(Use-After-Free)
System/System Hacking

[Heap] UAF(Use-After-Free)

UAF (Use-After-Free)

Use-After-Free vulnerabilities are a type of memory corruption flaw that can be leveraged by hackers to execute arbitrary code.

Use After Free specifically refers to the attempt to access memory after it has been freed, which can cause a program to crash or, in the case of a Use-After-Free flaw, can potentially result in the execution of arbitrary code or even enable full remote code execution capabilities.

www.webopedia.com/TERM/U/use-after-free.html

이미 비워진 (free)메모리를 사용해 유효한 데이터의 손상에서 임의의 코드 실행에 이르기 까지 여러가지 부정적 결과를 발생할 수 있는 취약점

=> 한 번 해제되었다가(free) 다시 할당받은 메모리의 주소 포인터를 이용해 데이터에 접근할 수 있는 취약점

malloc()함수를 사용할 때는 realloc과 달리 메모리 초기화과정을 거치지 않아 별도로 코드 상에 메모리를 초기화해주는 과정을 추가하지 않으면 UAF 취약점이 발생한다.

 

UAF

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main()
{
    char* a = malloc(160);
    char* b = malloc(256);
    char* c;
 
    free(a);
 
    c = malloc(144);
 
    strcpy(a, "Secret message");
}

△ UAF.c

a, b: 2개의 메모리를 할당→첫 번째 메모리(a)를 해제한 후 비슷한 크기의 메모리(c) 할당을 요청→이전에 해제된 메모리(a가 받았던 메모리)할당
a는 처음 할당받은 메모리의 포인터를 가지고 있고, c도 a가 할당받았던 메모리를 다시 할당받으면서 같은 메모리의 포인터를 가지게된다.

==> a가 가지고 있는 포인터를 이용해 데이터 변경 및 출력이 가능해진다.

UAF flow


UAF-1

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main()
{
        char* a = malloc(160);
        char* b = malloc(256);
        char* c;
 
        free(a);
 
        c = malloc(144);
 
        strcpy(c, "Secret message");
        printf("%s\n",a);
}

△ UAF-1.c

break point 설정

b1: "a"에 저장되는 메모리 주소 확인b2: "a"가 가리켰던 메모리의 해제 확인b3: "c"에 저장되는 메모리의 주소 확인b4: "c"가 가리키는 메모리에 저장된 데이터 확인b5: UAF 확인

 

b2까지 실행 후

△ "a"에 메모리 할당 및 해제까지의 과정

160byte의 메모리 할당을 malloc()에 요청하고 할당자는 0x602010을 반환해 "a"에 저장한다. 해당 메모리는 다른 크기의 메모리(b, 256byte)를 할당한 후에 해제하면서 unsorted bin에 등록된다.

 

△ "c"에 저장되는 메모리 주소 확인

144byte의 메모리 할당을 malloc()에 요청하면 할당자는 unsorted bin에 등록되었던 메모리(a가 가졌던 주소의 메모리)를 재할당한다.(c) Unsorted bin에 배치된 메모리의 크기(176)와 다른 크기의 메모리 할당(144)을 요청했는데 unsorted bin에 등록된 메모리(0x602010)가 반환된다.

할당자가 요청된 메모리의 크기가 unsorted bin에 배치된 메모리의 크기보다 작거나 같을 경우 해당 메모리를 우선적으로 사용한다.
unsorted bin에 배치된 메모리의 크기가 꽤..( 큰 경우, 요청된 메모리 크기만큼 할당하고 남은 메모리는 main_arena.last_remainder에 배치된다.

요청된 메모리(c, 144)를 할당한 후 남은 메모리의 크기(16byte)는 재사용할 수 없기 때문에 메모리를 분할하지 않고 (main_arena.last_remainder = 0x0) unsorted bin에 배치된 메모리의 크기(176)을 반환한다. 

 

 

"Secret message"를 재할당 받은 영역(c, 0x602010)에 입력하고 변수 "a"(0x602010)에 저장된 데이터의 출력을 요청하면 "Secret message"가 출력된다.

>> 변수 "a"가 가리키는 메모리는 해제했지만 변수 "a"에 저장된 값(0x602010)은 초기화되지 않았기 때문이다.

 

 

UAF-2

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main()
{
    char* a = malloc(160);
    strcpy(a, "Secret message");
    free(a);
    printf("%s\n",a);
}

△ UAF-2.c

메모리를 할당한 후에 데이터를 보관→해당 메모리(a) 해제

메모리를 해제하더라도 메모리에 보관된 데이터는 초기화되지 않는다. 따라서, 메모리를 출력한 후에도 a가 가리키는 메모리의 데이터를 출력할 수 있다.

 

break point 설정

b1: 할당된 포인터(a) 확인b2: 해제된 메모리의 데이터 확인b3: 데이터 출력 확인

 

메모리 해제
메모리 해제 후 데이터 확인

△ a에 저장된 메모리 주소의 메모리를 해제(free(a))할당되었던 메모리의 주소는 0x602010이고 해당 메모리에 데이터를 저장한 후 메모리를 해제했다.해제 한 후에도 저장된 데이터("Secret message")가 초기화되지 않았음을 확인할 수 있다.

 

△ 해제된 메모리 영역의 데이터 출력

 

www.lazenca.net/pages/viewpage.action?pageId=1148139

 

first-fit(Use-After-Free) - TechNote - Lazenca.0x0

Excuse the ads! We need some help to keep our site up. List UAF(Use-After-Free) UAF는 이전에 비워진 메모리를 사용하여 유효한 데이터의 손상에서 임의의 코드 실행에 이르기까지 여러 가지 부정적인 결과가 발생

www.lazenca.net

 

SMALL

'System > System Hacking' 카테고리의 다른 글

[Heap] House of Force  (0) 2020.11.03
[Heap] The House of Spirit  (0) 2020.09.30
[Heap] Double Free 취약점  (0) 2020.09.17
[Heap] Security Check  (0) 2020.09.13
[Heap] ptmalloc2  (0) 2020.09.12