본문 바로가기

보안/DreamHack

Dreamhack - Use After Free

우선 이 문제는 Ubuntu 18.04 64-bit(Glibc 2.27) 기준으로 만들어졌기 때문에 Dockerfile로 실습 환경을 구축해야했다.

 

일단 c코드를 살펴보면 Human과 Robot이라는 크기가 같은 구조체가 있다. 여기서 Human구조체의 age 변수에 어떤 함수의 주소를 입력하고 free되었을 때 Robot 구조체를 선언하면 robot_func함수로 인해 어떤 함수가 실행이 될 수 있다.

 

근데 따로 shell을 실행시켜주는 날먹 함수가 있나 봤는데 없었다.

 

따라서 one gadget을 이용해 shell을 얻을 것이다.

하지만 이렇게 shell을 얻기 위해서는 PIE로 매번 바뀌는 libc 주소도 추출해야 한다.

 

정리를 해보면

1. libc 주소를 얻기

2. libc주소를 기반으로 one gadget의 offset을 더해 human 구조체의 age에 넣고 robot 구조체 부르기

 

이 순서대로 진행을 할 것이다.

 

1. libc 주소 얻기

우선 리눅스에서 사용하는 memory allocator인 ptmalloc2의 unsorted bin의 특징을 알아야 한다.

32~176byte 크기의 청크들이 해제되었을 때 들어가는 fastbin에 들어가는 청크를 제외하고는 해제되었을 때 unsorted bin으로 들어가게 된다. 이때 unsorted bin에 처음 연결되는 청크는 libc 영역의 특정 주소와 이중연결리스트를 형성한다.

 

즉, unsorted bin에 처음 연결되는 청크의 fd와 bk값으로 libc의 특정 영역 주소를 갖는 것 이다.

따라서 unsorted bin에 연결된 청크를 재할당 한 후 uaf 취약점을 이용해 fd나 bk의 값을 읽으면 libc의 특정 영역 주소 값을 알 수 있고 offset을 빼면 libc base 주소를 알 수 있는 것 이다.

 

이때 해제할 청크가 top 청크와 맞닿아있으면 병합되기 때문에 청크를 2개 연속으로 할당하고 처음에 할당한 청크를 해제해야 병합을 피할 수 있다.

memory에 해당 상태로 chunk들이 존재할 때 chunk1을 free하면 memory 상태는 아래와 같이 변하고 unsorted bin에 chunk1이 free된 상태로 들어가게 되며 top chunk와 맞닿아있지 않으니 병합이 일어나지 않는다.

이때 unsorted bin으로 들어간 free chunk1의 fd나 bk의 값으로 libc의 특정 주소값을 갖는 것이다.

그래서 uaf 취약점을 이용하여 free chunk1과 같은 크기를 갖는 할당하면 fd나 bk값으로 libc의 특정 주소가남아 있으므로 libc 영역의 특정 주소를 추출할 수 있다.

 해당 사진을 보면 크기가 1280인 구조체를 할당하고 크기가 1280인 구조체를 할당하여 청크 2개를 할당했고 free idx값을 -1, 0으로 해서 2번째 청크를 할당함과 동시에 1번째 청크를 free해버렸다. 이후 1번째 청크와 같은 크기를 갖는 청크를 재할당 했더니 입력한 data 외에 다른 값이 남아있는 것을 알 수 있다.

 

이를 pwndbg로 살펴보자.

unsorted bin에 존재하는 free된 chunk를 보면 fd와 bk값으로 어떤 주소값을 갖고 있는데 

libc의 특정 영역 주소임을 알 수 있다.

 

따라서 해당 값을 읽고 offset만큼 뺴면 libc base의 주소를 구할 수 있다.

ubuntu 18.04 버전에서 libc-2.27.so  기준 offset은 0x3ebca0 이다.

이때 chunk에 들어가는 data를 A로 입력하면 offset의 값이 0x3ebc41, B로 입력하면 0x3ebc42가 될 것이다.

 

이렇게 libc base의 주소를 알아내면 one_gadget의 offset을 알아내 해당 주소를 human->age에 입력하고 robot을 호출하면 해당 주소에 해당하는 one_gadget 함수가 실행 될 것이다.

 

환경을 맞추기 위해 dockerfile을 이용해 ubuntu18.04.버전에서

강제로 주어진 libc를 사용하고 exploit 하면 

shell을 얻을 수 있다.

 

 

 

 

 

 

 

 

'보안 > DreamHack' 카테고리의 다른 글

Dreamhack basic_exploitation_003  (0) 2025.01.03
Dreamhack Recover  (1) 2024.12.06
Dreamhack basic_exploitation_002  (0) 2024.12.04
Dreamhack Format String Bug  (0) 2024.12.04
Dreamhack out of bound  (0) 2024.10.30