Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  • 다음과 같은 방법으로 공격할 수 있습니다.
    • Add Free chunk to Unsorted bin

      • 1개의 Heap 영역을 생성합니다.
      • Top chunk 영역에 아래와 같은 조건을 만족하는 값을 덮어 씁니다.
        • Top chunk + size는 페이지 정렬이 되어야 합니다.
        • Top chunk 값에 prev_inuse 비트를 설정해야 합니다.
        • Ex) Top chunk : 0x20c01, Overwrite to value : 0xc00 + 0x1 = 0xc01
      • Top chunk 영역의 값보다 큰 크기의 Heap 영역을 생성합니다.
        • Malloc은 이 요청을 처리하기 위해 sysmalloc이 호출됩니다.
        • sysmalloc()의 _int_free() 함수에 의해 "Top chunk - 0x8" 영역이 Unsorted bin에 등록됩니다.
        • "Top chunk" 영역을 Free chunk 형태를 가집니다.
    • Write to "Fake struct _IO_FILE_plus", " Fake struct _IO_wide_data"
      • Free chunk 영역에 "Fake struct _IO_FILE_plus", "Fake struct _IO_wide_data" 구조를 작성합니다.
        • Fake "struct _IO_FILE_plus"
          • _mode = '0' 보다 큰 값
          • vtable = "Fake vtable address"

          • _wide_data = "Fake struct _IO_wide_data"가 저장된 주소 

        • Fake "struct _IO_wide_data"

          • Fake "struct _IO_FILE_plus"가 작성된 공간을 활용 할 수 있습니다.

          • _IO_flush_all_lockp() 함수에서 사용하지 않는 "fp"변수의 "_freeres_list", "_freeres_buf" 영역 다음과 같이 활용합니다.

            • fp→_wide_data 변수에 fp→_offset의 주소 값을 저장합니다.
              • fp_freeres_list = _wide_data->_IO_write_ptr
              • fp_freeres_buf = _wide_data->_IO_write_base
    • Unsorted bin attack
      • Free chunk의 bk 영역에 "&_IO_list_all - 0x16 0x10" 값을 덮어 씁니다.
      • Free chunk를 smallbin[4]에 등록하기 위해 Free chunk의 size 값을 변경합니다.
        • 사용 가능한 크기 : 90 ~ 98
      • 새로운 Heap 영역을 생성합니다.
    • House of orange(?)
        • _int_malloc() 함수에서 "_IO_list_all" 영역의 값을 "main_arena.Top" 영역 주소로 변경합니다.
        • _int_malloc() 함수에서 smallbin[4] 영역의 값이  Free chunk 의 주소로 변경합니다.
        • _int_malloc() 함수에서 메모리 손상으로 인해 _IO_flush_all_lockp() 함수를 호출합니다.
        • _IO_flush_all_lockp() 함수는 변경된  "_IO_list_all"의 값(main_arena)을 사용하게 됩니다.
        • _IO_flush_all_lockp() 함수의 "fp = fp→_chain" 코드에 의해 fp 값이 변경됩니다.

          • 변경된 fp의 값은 "Fake struct _IO_FILE_plus"의 시작 주소입니다.
        • _IO_flush_all_lockp() 함수는 변경된 fp의 값을 이용해 _IO_OVERFLOW를 호출합니다.
          • _IO_list_all->vtable->_IO_overflow_t

          • _IO_OVERFLOW : fp + 0x60(vtable) → + 0x18(_IO_overflow_t) = 호출할 함수의 주소

...