tmxklab

[heap exploit] - Unsorted bin Attack 본문

Security/01 System Hacking

[heap exploit] - Unsorted bin Attack

tmxk4221 2020. 8. 4. 16:40

1. unsorted bin attack

unsorted bin에 등록된 chunk가 다시 재할당될 때 리스트에서 삭제하면서 발생한다. 이를 통해 특정 영역에 큰 수를 저장하거나 라이브러리 leak이 가능하다.

 

사용조건:

  • Unsorted Chunk를 생성할 수 있어야 한다.
  • Unsorted bin에 등록된 Free Chunk의 값을 변경할 수 있어야 한다.
  • Free Chunk와 동일한 크기의 Chunk를 요청할 수 있어야 한다.

 

Unsorted bin에 대한 내용 참고)

 

heap(4) - glibc malloc(3) (feat. bin)

참고 : GNU C Library의 Memory Allocator인 ptmalloc2(glibc 2.23)를 대상으로 설명 이번에는 Free된 Chunk들을 다시 재활용하기 위해서 Free Chunk들을 어떻게 관리하는지 자세하게 다뤄보겠다. 0. Boundary Tag..

rninche01.tistory.com

 

Unsorted bin 추가 내용)

Unsorted bin은 1개의 bin이 존재하며 double-linked list로 관리되는 bin이다. 다른 bin들과는 달리 Free Chunk의 크기에 상관없이 등록되며 large bin, small bin에 들어가기 전에 먼저 해당 bin에 등록된다.

이후에 malloc요청할 경우 fast bin, small bin, large bin에서 알맞은 크기의 Free Chunk를 찾지 못하면 Unsorted bin에서 사용 가능한 Chunk가 있는지 찾는다.

 

이 때, Unsorted bin attack은 Unsorted bin에서 사용가능한 Free Chunk를 찾고 Free Chunk를 재할당하기 위해 Unsorted bin list에서 제거하면서 발생한다.

 

unsorted bin source code

for (;; )
    {
      int iters = 0;
      while ((victim = unsorted_chunks (av)->bk) != unsorted_chunks (av))
        {
          bck = victim->bk;

https://elixir.bootlin.com/glibc/glibc-2.23/source/malloc/malloc.c#L3467

  • unsorted_chunks (av) → bk와 unsorted_chunks (av)가 같은지 확인하여 서로 다르면 Unsorted bin에 free chunk가 존재하므로 victim에 unsorted_chunks (av) → bk의 값을 저장한다.
  • 이후에 다시 bck에 victim → bk의 값을 저장한다.
/* The otherwise unindexable 1-bin is used to hold unsorted chunks. */
#define unsorted_chunks(M)          (bin_at (M, 1))

https://elixir.bootlin.com/glibc/glibc-2.23/source/malloc/malloc.c#L1533

/* addressing -- note that bin_at(0) does not exist */
#define bin_at(m, i) \
  (mbinptr) (((char *) &((m)->bins[((i) - 1) * 2]))			      \
             - offsetof (struct malloc_chunk, fd))

https://elixir.bootlin.com/glibc/glibc-2.23/source/malloc/malloc.c#L1401

  • 여기서 unsorted_chunks (av)는 bin_at()을 호출하여 반환된 값이며
  • bin_at()은 main_arena.bin[0]의 주소에서 0x10을 뺀 값을 반환한다.
/* remove from unsorted list */
unsorted_chunks (av)->bk = bck;
bck->fd = unsorted_chunks (av);

https://elixir.bootlin.com/glibc/glibc-2.23/source/malloc/malloc.c#L3515

  • unsorted bin에 있는 Chunk를 재할당하는데 사용하고 chunk를 unsorted bin(Double Linked List)에서 제거하는 작업을 진행한다.

 


2. 공격 시나리오

2.1 정상적인 시나리오

1) unsorted bin에 Free된 Chunk가 2개 있는 경우

 

2) Chunk A를 재할당하는데 사용

 

2.2 비정상적인 시나리오

1) Chunk A의 bk 값을 수정하였을 때

  • 원래는 unsorted bin에 Chunk A만 존재하여 Chunk A의 bk값이 main_arena를 가리켜야 하지만 Chunk A의 bk값을 임의의 주소(여기서는 Fake Chunk라고 부르겠다.)로 변경되었다.

 

2) Chunk A를 재할당하는데 사용

  • bck→fd = unsorted_chunks(av)에 의해 Fake Chunk의 fd 주소 값에 unsorted_chunks(av)값이 들어가 있는 것을 확인할 수 있다.
  • 만약 우리가 원하는 주소 값(Fake Chunk의 fd)에 큰 값을 넣고자 한다면 Chunk A의 bk부분에 "원하는 주소 값 - 0x10"을 넣으면 될 것이다.

 

Unsorted bin Attack 문제풀이)

 

hitcon training [LAB 14]

1. 문제 1) mitigation확인 2) 문제 확인 3) 코드흐름 파악 3-1) main() int __cdecl __noreturn main(int argc, const char **argv, const char **envp) { int v3; // eax char buf; // [rsp+0h] [rbp-10h] uns..

rninche01.tistory.com


3. References

'Security > 01 System Hacking' 카테고리의 다른 글

heap(5) - tcache 정리  (0) 2020.08.24
Linux system call table 정리(32bit, 64bit)  (0) 2020.08.20
[heap exploit] - Unsafe Unlink  (4) 2020.07.31
[heap exploit] - House Of Force  (0) 2020.07.27
heap(4) - glibc malloc(3) (feat. bin)  (3) 2020.07.07
Comments