[heap] unsorted bin attack

dandb3·2024년 5월 9일
0

pwnable

목록 보기
22/25

_int_malloc의 해당 부분 코드만 가져와 보면,,

  for (;; )
    {
      int iters = 0;
      while ((victim = unsorted_chunks (av)->bk) != unsorted_chunks (av))
        {
          bck = victim->bk;
          size = chunksize (victim);
          mchunkptr next = chunk_at_offset (victim, size);

          if (__glibc_unlikely (size <= CHUNK_HDR_SZ)
              || __glibc_unlikely (size > av->system_mem))
            malloc_printerr ("malloc(): invalid size (unsorted)");
          if (__glibc_unlikely (chunksize_nomask (next) < CHUNK_HDR_SZ)
              || __glibc_unlikely (chunksize_nomask (next) > av->system_mem))
            malloc_printerr ("malloc(): invalid next size (unsorted)");
          if (__glibc_unlikely ((prev_size (next) & ~(SIZE_BITS)) != size))
            malloc_printerr ("malloc(): mismatching next->prev_size (unsorted)");
          if (__glibc_unlikely (bck->fd != victim)
              || __glibc_unlikely (victim->fd != unsorted_chunks (av)))
            malloc_printerr ("malloc(): unsorted double linked list corrupted");
          if (__glibc_unlikely (prev_inuse (next)))
            malloc_printerr ("malloc(): invalid next->prev_inuse (unsorted)");
            
            ...
            
          if (__glibc_unlikely (bck->fd != victim))
            malloc_printerr ("malloc(): corrupted unsorted chunks 3");
          unsorted_chunks (av)->bk = bck;
          bck->fd = unsorted_chunks (av);

만약 여기서 victim->bk의 값을 내가 원하는 값으로 조작할 수 있다면,

          bck = victim->bk;
          
          ...
          
          bck->fd = unsorted_chunks (av);

요 두 부분의 코드에 의해서 원하는 주소에다가 unsorted bin의 주소를 저장할 수 있다.

이 때 우회해야 하는 부분은 다음과 같다.

          if (__glibc_unlikely (bck->fd != victim)
              || __glibc_unlikely (victim->fd != unsorted_chunks (av)))
            malloc_printerr ("malloc(): unsorted double linked list corrupted");

즉, victim->bk의 fd값([2])만 victim값으로 수정할 수 있다면 우회를 할 수 있게 된다.

profile
공부 내용 저장소

0개의 댓글