드림핵 워게임 문제를 풀다가 막혀 강의자료를 정리한 글로 잘못된 내용이 있을 수 있습니다.
1. GLIBC 2.26과 2.29 버전 차이
이전 double free bug에 대해 정리하면서 2.29버전에서는 이를 막기위한 코드가 추가되었다고 언급했었습니다.
추가된 코드 부분은 tcache를 관리하는 tcache_entry 구조체 부분과
tcache_put, tcache_get 함수를 보면 알 수 있습니다.
먼저 tcache_entry 부분을 비교해보면
key라는 멤버 변수가 추가되었고 이는 duble free 발생여부를 확인하기 위해 존재한다고 합니다.
tcache_put 부분에서 변경된점은 e->key=tcache 입니다.
e->key에 tcache를 삽입하는데 이 의미는 tcache_entry 구조체 주소를
key에 삽입하는 것으로 duble free를 검증할 목적으로 추가된 부분입니다.
(이때 검증을 put내부에서 검증하는 것이 아닌 _int_free 함수에서 검증을 합니다)
tcache_get 에서는 e-> key = NULL 이 추가되었습니다.
마지막으로 검증을 하는 함수 _int_free 함수를 보면 다음과 같습니다.
이전 put에서 삽입한 e->key 와 tcache가 같다면 duble free를 했다는 문장을 출력해주면서 멈추게 됩니다.
2.26버전에서는 검증이 없었기 때문에 double free를 하게되면
0x555555559010 -> 0x555555559010 처럼 본인이 본인을 가르키는 구조를 이루게 됩니다.
이를 이용해 공격자가 원하는 주소로 덮어씌워 공격이 가능한 구조였습니다.
하지만 검증코드로 인해 e->key에 tcache 포인터가 쓰여진 상태에서
free함수가 호출되면 e->key 값과 free하려는 tcache구조를 비교해 비정상 종료를 하게됩니다.
2. GLIBC 2.29버전 Tcache Double Free bypass
위의 내용을 토대로 보면 2.29버전에서는 이전과 동일하게
tcache dup, poisoning 기법을 사용해 공격할 수 없게 되었습니다.
하지만 힙 오버플로우, Use-After-Free 취약점을 이용하면 이를 우회가 가능하다고 합니다.
우리가 2.29버전에서 검증을 담당하는 코드의 if 조건문을 자세히 보면
key와 tcache가 같은가를 확인합니다.
if (__glibc_unlikely (e->key == tcache))
만약 공격자가 힙 오버플로우나 Use-After-Free 취약점을 통해 e->key 값의 변경이 가능하다면?
Double Free를 검증하는 if 조건문에 걸리지 않게 됩니다.
이는 공격자가 해제된 청크에 입력값을 넣을 수 있다면 얼마든지 우회가 가능하다는 것입니다.
3. Ex) Tcache Double Free bypass
예시 코드로 예를 들면
전역변수인 target 을 오염시키는 것이 목적인 코드입니다.
먼저 0x20만큼 청크를 할당하고 해제해줍니다.
원래라면 free(ptr)이후 포인터도 초기화를 해야 하지만 하지 않았기에 해제된 청크에 값을 쓰는 것이 가능하게 됩니다.
ptr[1]에는 현재 tcache_entry 구조체에 따라 key값이 들어있게 됩니다.
즉 ptr[1]=0x0으로 key값을 덮어쓰는 것으로 Double free가 가능하게 됩니다.
Double free로 인해 현재 tcache 구조는 본인이 본인을 가르키는 구조가 됩니다.
ptr[0]에는 구조체를 보면 *next 즉 다음 주소가 들어있으니 이를 target 전역변수로 지정하면
ptr의 fd즉 *next가 target주소를 가르키게 되는데
이러한 상태에서 malloc(0x20)으로 청크를 할당하면 전역변수 target영역에 청크가 할당되게 됩니다.
target영역에 청크가 할당되었으니 ptr2[0]에 0x41414141을 덮어쓰게 되면
target이 41414141로 공격자가 원하는대로 오염되게 됩니다.
위의 예제를 통해 2.29버전에서 key라는 멤버 변수가 추가되어도 2.26버전보다 난이도는 상승했지만
검증 코드를 우회하고 Double free Bug를 일으키는것에 성공했습니다.
이 외에도 2.29버전에서는 여러 공격기법에 대한 검증코드가 추가된 것이 많이 있습니다.
이에 대해 공부를 하면서 하나씩 정리하도록 하겠습니다.
'Reference > Pwnable_Study' 카테고리의 다른 글
[Pwn] gdb offset Tip (0) | 2023.04.01 |
---|---|
[Pwn] Overwrite _rtld_global (0) | 2023.04.01 |
DFB(Double Free Bug) 취약점 (0) | 2023.01.19 |
(Linux) Heap 구조 이해하기 1 (0) | 2023.01.17 |
OOB(Out of Bounds) 취약점 (1) | 2023.01.07 |