2012-04-18 7 views
0

안녕하세요. 힙 오버플로가 작동하는 방식을 이해하려고 노력 중이며이 기사를 읽었습니다.이 기사는 나에게 매우 안개가 낀다. 아래는 내가 붙어있는 기사 페이지입니다.힙 오버 플로우 기사를 이해하지 못했습니다.

http://www.h-online.com/security/features/A-Heap-of-Risk-747224.html

나의 이해는 링크 페이지 4 년 하반기 이후 중단. 그들은 유용한 2 페이지에 자신의 힙 관리자를 구현합니다. 아래 그림은 문자열 복사 후 이미지 데이터에 대한 힙 데이터 구조를 나타냅니다.

Root = Hdr      Free Memory 
_________________     ________________ 
|*Next = 0xF  |----------->0xF|*Next = "AAAA" | 
-------------------    ------------------ 
|*Previous = NULL |    |*Previous="AAAA"| 
-------------------    ------------------ 
|Size = 0   |    |Size = "AAAA" | 
-------------------    ------------------ 
|Used = 0   |    |Used = "AAAA" | 
-------------------    ------------------ 
            |Free Mem Data | 

(루트는 0x0을 시작하자. 또한 각 필드는 32 비트 와이드 따라서 4 바이트이다. "AAAA"은 각각의 'A'는 문자 메모리 그에 한 바이트는 문자열 "AAAA"를 의미 .)

튜토리얼에서 그들은 메모리가 해제되었을 때 Free_Heap() 함수가 "AAAA"= 0x4141414d 주소를 읽고 싶어한다고 말합니다. 설명은 "used"필드가 헤더 섹션의 시작부터 12 바이트 오프셋이므로 0x41414141 + 0xc = 0x4141414d입니다. 나에게 그 설명은 다음과 같은 이유로는 의미가 없습니다.

가) Free_Heap()은 Free_Heap()에 힙 구조의 데이터가 사용되는지 여부를 알려주는 경우에만 "사용 된"필드의 주소에서 읽으려고합니다. "used"필드가 실제 데이터에 대한 포인터 (튜토리얼에서 언급하지 않음)가 아니라면, 이것은 나에게 전혀 이해가되지 않을 것입니다.

B) 실제로 힙 구조체의 사용 된 필드가 쓰여질 수있는 데이터에 대한 포인터라고 가정하면 힙을 읽어야하는 위치와 오프셋이 어떤 관련이 있습니까? 데이터 섹션이 "사용 된"포인터 필드 바로 뒤에있는 경우 (예 : 스택에서와 같이) 데이터가 "사용 된"데이터를 덮어 쓰지 않도록 0xc가 아닌 0xf의 오프셋에 데이터를 배치해야 함을 의미합니다. 들.

도움이되는 의견을 보내 주셔서 감사합니다.

답변

1

기사의 해당 부분이 잘못되었거나 실제로 잘못 작성된 것 같습니다. hdr->next->used을 읽어 들여 후속 메모리 개체가 사용 중인지 여부를 확인하십시오. 해당 usedsize 필드는 0x41414141이되므로 병합을 시도하지 않습니다. 그래도 설치가 정상적으로 작동하면 이됩니다. 잠시 후에 그 포인터 중 하나를 참조 해제하십시오. 'line'메모리 객체 (헤더가 빗나간 코드)를 해제하면 메모리 블록이 nextprev 인 지 확인합니다 용도. 이러한 포인터 필드 중 하나를 참조 해제하면 충돌하거나 적극적으로 악용됩니다.

+0

그러면 기사에서 읽은 것보다 훨씬 더 의미가 있습니다. 고마워, 나는 포기하고 stackoverflow를 묻기 전에 20 번 그 섹션을 읽었어야합니다. –