EYEN 2024. 10. 29. 14:19

 

#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이 할당한 메모리 공간을 의미한다. 청크는 헤더와 데이터로 구성된다.