P_Squirrel
Squirrel Hack
P_Squirrel
전체 방문자
오늘
어제
  • 분류 전체보기 (434)
    • Wargame(Web) (176)
      • Webhacking.kr Writeup (58)
      • DreamHack Writeup (67)
      • Lord of SQLInjection (40)
      • Websec.fr (2)
      • Webgoat (1)
      • G04T war (7)
    • Wargame(Pwnable) (95)
      • DreamHack Writeup (69)
      • pwnable.xyz Writeup (20)
      • G04T war (6)
    • Wargame(Reversing) (26)
      • DreamHack Writeup (26)
    • Wargame(crypto) (7)
      • DreamHack Writeup (7)
    • Wargame(DigitalForensic) (41)
      • CTF-D Writeup (28)
      • DreamHack Writeup (6)
      • Suninatas Writeup (7)
    • Wargame(misc) (4)
      • DreamHack Writeup (4)
    • DreamHack CTF (21)
    • BDSec CTF (5)
    • AmateursCTF (2)
    • ångstrom CTF (6)
    • L3ak CTF (1)
    • Hspace war (1)
    • Reference (42)
      • Language_Study (10)
      • Pwnable_Study (24)
      • Web Hacking_Study (3)
      • Linux (2)
      • Windows Kernel (1)
    • 자격증 공부 (2)
      • 정보처리기사 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 문

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
P_Squirrel
Reference/Pwnable_Study

tcache double free bypass

Reference/Pwnable_Study

tcache double free bypass

2023. 2. 12. 07:32

드림핵 워게임 문제를 풀다가 막혀 강의자료를 정리한 글로 잘못된 내용이 있을 수 있습니다.

 

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
  • 1. GLIBC 2.26과 2.29 버전 차이
  • 2. GLIBC 2.29버전 Tcache Double Free bypass
  • 3. Ex) Tcache Double Free bypass
'Reference/Pwnable_Study' 카테고리의 다른 글
  • [Pwn] gdb offset Tip
  • [Pwn] Overwrite _rtld_global
  • DFB(Double Free Bug) 취약점
  • (Linux) Heap 구조 이해하기 1
P_Squirrel
P_Squirrel
Squirrel HackP_Squirrel 님의 블로그입니다.

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.