힙 개발 노트
기타
2020-02-23 03:52:08
독서 시간: null
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의 배수 여야합니다
- 즉, 정렬 여부입니다
- 크기는 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