[바이너리 익스플로잇] Heap Unsafe-Unlink : Heap Overflow와 전역 변수로 heap이 관리될 때 발생하는 임의의 주소 쓰기(AAW) 공격

2022. 1. 24. 16:17Binary Exploitation/Heap

Heap Overflow로 인해 힙 청크에 페이크 청크를 만들 수 있고 하위 청크의 prev_inuse Flag를 덮어쓸 수 있을 때 Unsafe Unlink를 발생시켜 Unlink 루틴을 악용할 수 있다. 해당 바이너리가 전역 변수에서 Heap 메모리의 주소를 관리하고 있을 경우 Unlink 검증 과정을 우회하여 Heap 메모리 주소가 담겨있는 전역 변수를 해당 전역 변수의 주소 - 16 값으로 변조시킬 수 있고 Heap 메모리 쓰기를 통해 다시 해당 전역 변수의 값을 원하는 값으로 변조 시켜 임의의 주소 쓰기(AAW)가 가능해진다.

 

해당 공격은 Tcache에서는 발생하지 않으며, fastbin 역시 단일 링크 리스트를 사용하기에 해당 공격이 발생하지 않는다.

 

  1. Fake 청크 생성과 prev_inuse Flag 변조
    • 청크 A, B, C 생성 : 0x18과 같이 0x8 배수로 끝나는 청크를 생성하여 prev_size 값을 조작할 수 있어야함.
    • 페이크 청크 생성 : [context]는 heap 메모리를 관리하는 전역 변수 리스트, 바이너리 내부 취약점을 활용하여 prev_inuse Flag 위조 

      A 청크

      0x0000000000000000 0x0000000000000091
      0x0000000000000000 0x0000000000000000
      [context] - 24 [context] - 16
      0x0000000000000000 0x0000000000000000
      [A 청크의 사이즈] - 0x10 <- B 청크의 prev_size

      B 청크

      [A 청크의 사이즈] - 0x10 0x0000000000000090
      0x0000000000000000 0x0000000000000000
      0x0000000000000000 0x0000000000000000
      0x0000000000000000 0x0000000000000000
      0x0000000000000000  
  2. Unlink 루틴 악용으로 전역 변수 덮어쓰기
    • 청크 B를 Free하여 Unlink 루틴 실행 :
      [context] [context] - 24
      [context] + 8 [B 청크의 주소]
      [context] + 16  
      [context] + 24  
      [context] + 32  
  3. Heap 메모리 쓰기로 전역 변수 값 위조, AAW 발생 시키기
    • Heap 메모리 쓰기로 전역 변수 값 위조 : [context]를 참조하여 메모리 쓰기를 할 경우 [context]-24에 해당하는 메모리 주소에 메모리 쓰기를 할 수 있음. b'0x61'*16 + [원하는 주소] 를 대입하여 [context] 주소의 값을 [원하는 주소]로 변경. 메모리 쓰기 사이즈에 제한이 있을 경우 청크 a,b,c를 만든 이후 청크 A, B를 만들어 Unlink 공격을 실행한다음 [context]의 청크 a가 있을 주소를 참조하여 메모리 쓰기할 수 있음.
    • 임의의 메모리 쓰기(AAW) 발생 : 다시 [context]를 참조하여 메모리 쓰기를 할 경우 [원하는 주소]에 메모리 쓰기가 가능함.