힙 개발 노트

malloc에의 첫 번째 구현

  • 크기> = 128K : mmap를 이용하여 함수의 커널 sys_mmap
  • 크기 <128K : 사용 BRK 기능, 커널 sys_brk
  • 처음의 malloc에 <128K는 커널 힙의 132킬로바이트 줄 것이다 상관없이 얼마나 많은 공간이
    세그먼트 (RW),이 부분은 주 경기장라고
  • 상기 첫번째 덩어리로부터 덩어리를 할당하는 두 청크에 처음의 malloc 힙 컷 할 때, 상위 청크 나머지 공간은 다음 경우에서 불충분 한 공간을 할당하는 경우 상단 청크에서 절단 될 것이다

두 번째 실행의 malloc

  • 만큼 총 메모리 크기에서 할당으로 다음 시스템 호출이 공간에 시스템이 실행되지 않습니다 1백28킬로바이트을 초과하지 않는 메모리 공간을 제공 BRK 사용하는 커널의 크기를 초과하는 것
  • 모든 주요 무대가 끝난 메모리를 본체 밖으로 할당됩니다하더라도, 그것은 바로 커널을 반환하지 않습니다
  • glibc에 의해 관리 그리고 메모리 공간

주 경기장 헤더

  • malloc_state
  • 이 쓰레기통, 빠른 빈, 최고 청크 정보
  • BSS를 세그먼트 libc에 위치한

힙 오버 플로우

  • 힙 세그먼트에서 발생하는 오버 플로우 버퍼
  • EIP는 일반적으로 직접 제어 할 수없는, 그러나 하부 커버 청크 heaker를 사용하여, 동작 및 사용 링크 해제 간접적 쓰기 어디서나 연결 한 후 EIP 제어
  • 연결 해제 사용 : FD-> BK = BK와 BK-> FD = FD 임의 메모리 연결 해제 해제 된 청크 포인터 및 FD BK 재사용 덮어 오버플하여 그 위치를 변경할

검출에서의 malloc

  • 크기는 상황 fastbin입니다
    • 메모리 손상
      • Fastbin fastbin 속하지 않는 청크 크기의 첫 번째 블록에서 꺼내고
      • 주 체크 모드는 fastbin 청크의 크기가 fastbin에 속하는 최초의 검사 후에 취출 대응 찾기 위해 상기의 malloc 바이트 크기 인덱스 후에 이루어진다
      • 실제 비교 fastbin 만들어진 첫 번째 블록 크기 인덱스를 fastbin 처음이다 때, 바로 인덱스의 인덱스가 같은보다 카운트 이동하지만, 인덱스를 복용의 방법은 서명되지 않은 INT이다.
  • 크기는 상황 smallbin입니다
    • 손상된 이중 연결리스트를 smallbin
      • 는 smallbin 이중 링크 목록을 충족하기 위해, 마지막 하나를 수행 smallbin 대응에서
      • 청크의 마지막 조각 smallbin 피해자 ==
      • BCK = 피해자 -> BK
      • bck-> FD = 피해자
  • unsortbin이 덩어리
    • 메모리 손상
      • 피해자로 청크의 마지막 조각을 Unsortbin
      • 피해자 -> 크기의 규정을 준수합니다
      • 크기는 2 × SIZE_SZ보다 커야합니다 덜 system_mem 이상이어야합니다
  • 크기는 케이스의 큰 빈입니다
    • 손상된 분류되지 않은 덩어리
      • 사용자에게 적합한 덩어리 컷을 찾은 후, 나머지 공간은 unsortbin 추가, 마지막으로 나머지를 배치됩니다
      • FD unsortbin 수행 될 처음 unsortbin 위치 같은지

무료 감지

  • 잘못된 포인터
    • 정렬을 확인
      • 청크 어드레스는 8의 배수 인
    • 청크 주소를 확인하는 것은 - 크기보다 작
  • 잘못된 크기
    • 청크 크기가 법적으로 확인
      • 크기는 8의 배수 여야합니다
      • 즉, 정렬 여부입니다
    • 크기는 MINSIZE보다 커야합니다
  • 크기는 상황 fastbin입니다
    • 유효하지 않은 다음 크기 (빠른)
      • 청크 크기를 검사하는 것은 합법적이다
      • 크기는 MINSIZE보다 커야합니다
      • 크기는 system_mem보다 작아야합니다
    • 더블 무료 또는 손상 (fasttop)
      • 다른 경우 무료가는 청크로 fastbin 첫 번째 블록 청크를 확인
      • 같은 의지 중단하는 경우
  • 그것은 smallbin 및 largebin 케이스의 크기 (비의 mmap)
    • 더블 무료 또는 손상 (위)
      • 위치가 있는지 다른 상단의 청크로 덩어리를 확보하고 있었다 확인
      • 같은 의지 중단하는 경우
    • 더블 무료 또는 손상 (교체 아웃)
      • 청크의 계산 된 위치는 힙의 경계를 초과
      • 힙의 경계가 중단됩니다 넘어
    • 더블 무료 또는 손상 (! 이전)
      • 너무 청크의 덩어리에서 비트 사용중 무료 아래를가는 무료되었는지 여부를 확인하려면
    • 유효하지 않은 다음 크기 (정상)
      • 크기는 2 × SIZE_SZ보다 커야합니다
      • 크기는 system_mem보다 작아야합니다
    • 손상된 분류되지 않은 덩어리
      • 링크 해제 unsortbin 말하면 후, 청크의 취출 unsortbin 시작하고 덩어리가 확인하는 것이다 unsortbin BK 같음
  • 링크 해제 일에
  • courrupted 이중 연결리스트
    • 무결성의 원형 이중 연결리스트를 확인하십시오, 그렇지 않으면 이중 연결리스트 인터럽트를 손상 나타냅니다, 손가락 뒤로 이동해야 포인트 값을 지적
    • P-> BK-> P == FD
    • P-> FD-> P == BK

링크 해제를 사용하여 (현대)

  • 검출 패스
    • 우리는 덩어리 구조를 위조한다
    • 당신은 가짜 포인터의 덩어리 포인터의 주소에 대한 링크를 찾아야합니다
    • 따라서 제한된 변화에 직접, 간접적으로 일반적으로, 임의의 위치를 ​​읽거나 쓸 곳
    • 그것은 일반적으로 데이터 포인터 R 것
    • 그 연구의 근방에 존재하는 변화에 다른 포인터를 사용하고이 포인터를 사용하여 판독을 야기하고,보다 직접적인 제어 함수 포인터 EIP가 있다면, 임의의 위치를 ​​작성할 수있다.

사용 malloc에 ​​말레 피카

  • 스택 오버플로
    • 스택 오버 플로우가 커버 RET에 충분하지 않을 때
    • 사용 스택 오버 플로우 커버는 PTR와 가짜 체크를 해제합니다
    • 처리는 검사에 의해, 지정한 prev_size 및 크기에 대해 수행 할
  • fastbin를 사용하여
    • 다음의 malloc은 가짜 덩어리를 얻을 것이다 때
  • 성령의 집
    • 당신은 정보 유출을 만들 수 있습니다
    • 또한 스택 voerflow 거리를 증가시킬 수있다
    • 크기의 덩어리를 아래로 가서 먼저 계산 스택은 크기가 매우 중요합니다에 따라, 8의 배수
  • 포스의 집
    • 힙 오버 플로우 커버 크기 최고 청크, 그것은 큰 값이된다
    • 다음번의 malloc 매우 많은 수 (NB) malloc이 후 위치는 경기장 헤더 상단 청크을 바꿀
      • 새로운 최고 덩어리 = 오래된 탑 + NB + 8
      • 의 패스가 자동으로 가짜의 szie만큼, 매우 많은 수로 변환되기 때문에주의가 음수가 될 수 있습니다 - 브라 반트> 0 가기 여지가 있음을 glibc에 드릴 것입니다
    • 이러한 위치는 위치의 다음 malloc에 ​​새로운 최고 덩어리가 될 것입니다.

fastbin 사용

  • 성령의 유사 하우스
  • 변경 위치의 FD 가짜 청크 될 수없는 덩어리의 fastbin로 변경할 수있는 경우,
    다음의 malloc은이를 확인하기 때문에 그들은 같은 fastbin의 일부는 크기 변화를 충족
  • 다음 다음의 malloc (사이즈 0x10을)를,의 가짜 청크의 위치를 ​​얻을 것이다
  • 가짜 청크는 메모리 대상물 위치 할 수있다

몇 가지 유용한 전역 변수

  • __free_hook, __malloc_hook, __realloc_hook
    • 상위 세 전역 변수 값이있는 경우가 실행되면 무료, malloc에 ​​전에, realloc을 먼저 확인합니다 때 FUNC의 PTR
  • __malloc_initialize_hook
    • ptmalloc_init (제 1 런의 malloc을 사용할 때), 그것을 행하면 변수에 값을 갖는지 여부를 검사 할 때 FUNC PTR
  • __after_morecore_hook
    • 변수에 값이 있는지 확인합니다 시스템 BRK 힙 공간을 말했을 때 그 때 FUNC의 PTR을 실행하면

콘텐츠 원본

힙 착취

추천

출처www.cnblogs.com/luoleqi/p/12348316.html