DreamHack-Use after free
#1 배경 지식
Memory Allocator : 운영체제에서 메모리가 필요한 프로세스에 필요한 만큼만의 메모리를 빠르게 할당하여 메모리의 공실을 줄이는 것
리눅스의 Memory Allocator가 ptmalloc2, 구글은 tcmalloc, 페이스북과 파이어폭스는 jemalloc
#2 ptmalloc2 환경 설정
ptmalloc2는 glibc에 구현되어 있음
glibc 버전에 따라 공격 기법에 차이가 있다
glibc 2.26부터 tcache라는 게 도입되었다.
FROM ubuntu:18.04
ENV PATH="${PATH}:/usr/local/lib/python3.6/dist-packages/bin"
ENV LC_CTYPE=C.UTF-8
RUN apt update
RUN apt install -y \
gcc \
git \
python3 \
python3-pip \
ruby \
sudo \
tmux \
vim \
wget
# install pwndbg
WORKDIR /root
RUN git clone https://github.com/pwndbg/pwndbg
WORKDIR /root/pwndbg
RUN git checkout 2023.03.19
RUN ./setup.sh
# install pwntools
RUN pip3 install --upgrade pip
RUN pip3 install pwntools
# install one_gadget command
RUN gem install one_gadget
WORKDIR /root


$ IMAGE_NAME=ubuntu1804 CONTAINER_NAME=my_container; \
docker build . -t $IMAGE_NAME; \
docker run -d -t --privileged --name=$CONTAINER_NAME $IMAGE_NAME; \
docker exec -it -u root $CONTAINER_NAME bash
# ptmalloc2이란
ptmalloc2(pthread malloc 2) , glibc에 구현되어있음.
어떤 메모리가 해제되면 해제된 메모리의 특징을 기억하고 있다가 비슷한 메모리의 할당 요청이 발생하면 이를 빠르게 반환해준다.
1) ptmalloc2의 목표
1. 메모리 낭비 방지
: 프로세스가 메모리 할당 요청을 하면 ptmalloc이 해제된 메모리 공간 중에 재사용할 수 있는 공간을 탐색
2. 빠른 메모리 재사용
: 해제된 메모리 공간의 주소를 tcache또는 bin이라는 연결 리스트에 저장해둔다. tcache와 bin은 여러 개이고 각각 다른 크기 범위의 메모리 공간을 저장한다.
3. 메모리 단편화 방지
: 내부 단편화(메모리>>>실제데이터)와 외부 단편화(메모리<--->메모리) 라는 비효율을 줄이기 위해 정렬, 병합, 분할을 사용한다.
(1) 정렬
: 64비트 환경에서 ptmalloc은 메모리 공간을 16바이트 단위로 할당해준다.
(ex, 4바이트 요청->16바이트, 17바이트 요청->32바이트/ 내부 단편화긴 한데 외부 단편화는 감소시킴)
공간을 정렬? 하지 않고 요청하는 만큼 할당하면 연속적으로 할당되며 외부 단편화 최소화할 수 있을 것 같지만,
해제한 만큼의 할당 요청이 발생할 확률보다 그 언저리의 공간만큼의 요청이 발생할 확률이 높음
그때, 모두 해제한 공간만큼을 줘야 재사용률을 높이고 외부단편화도 줄일 수 있다.
그니까 16바이트씩 할당하는 방식말고 4바이트, 17바이트씩 요청한 대로 할당을 한다고 하면 해제한만큼의 요청이 들어올 확률은 적으니까 외부 단편화는 계속 늘어나고 재사용률도 낮아질 수 밖에 없음.
=> 16바이트로 정렬을 해서 할당 주는 것이 더 효율적.
(2) 병합, (3) 분할
: 특정 조건 만족시 해제된 공간을 병합하여 병합으로 생성된 큰 공간은 그대로나 분할되어 재사용한다. 잘게 나뉜 영역은 병합하고 필요할 때 다시 분할하여 공간의 재사용률과 외부 단편화를 줄일 수 있다.
16바이트X4-> 64바이트로 병합해놓고, 64바이트-> 32바이트x2 이렇게 분할하
2) ptmalloc의 객체
ptmalloc2는 청크, bin, tcache, arena를 주요 객체로 사용.
청크 : ptmalloc이 할당한 메모리 공간을 의미한다. 청크는 헤더와 데이터로 구성된다.