2012-04-18 2 views
0

Привет, я пытаюсь понять, как работает переполнение кучи, и я читал эту статью, которая кажется мне очень туманной. Ниже приведена страница статьи, в которой я застрял.Не понимаю, что происходит переполнение кучи article

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 байта в ширину. «АААА» обозначает строку «АААА», где каждый «А» представляет собой символ, и для этого один байт памяти .)

Из учебника они говорят, что когда память якобы освобождена, функция Free_Heap() будет читать по адресу «AAAA» = 0x4141414d. Объясняется это тем, что поле «used» является смещением в 12 байт от начала раздела заголовка и, таким образом, 0x41414141 + 0xc = 0x4141414d. Для меня это объяснение не имеет смысла по следующим причинам.

A) Почему Free_Heap() даже попытается прочитать из адреса в поле «used», когда это значение сообщает Free_Heap(), используются ли данные в структуре кучи. Если поле «used» не является указателем на фактические данные (которые не упоминаются в учебнике), это не имеет никакого смысла для меня.

B) Предполагая, что используемое поле в структуре кучи действительно является указателем на данные, которые могут быть записаны, почему смещение должно иметь какое-либо отношение к тому, откуда должна считываться куча? Может быть, если раздел данных был расположен сразу после «используемого» поля указателя (например, в стеке), это означало бы, что данные должны быть размещены со смещением 0xf, а не 0xc, чтобы данные не перезаписывали «используемые», поле.

Спасибо за любой полезный ввод, чтобы очистить это.

ответ

1

Эта часть статьи кажется неправильной или просто очень плохо написана. Хотя будет читатьhdr->next->used, чтобы проверить, используется ли следующий объект памяти, как вы говорите, его поля used и size будут 0x41414141, поэтому мы не будем пытаться объединиться с ним. Тем не менее, настройка в порядке, вы будете вскоре после этого разыщите один из этих указателей: при освобождении объекта памяти 'line' (тот, чей заголовок мы топаем), он попытается проверить, находятся ли его блоки памяти и prev использовать. Развертывание любого из этих полей указателей приведет к сбою или активному использованию.

+0

Это намного больше имеет смысл, чем я читал в этой статье. Спасибо, я должен был прочитать этот раздел 20 раз, прежде чем сдаваться и попросить stackoverflow. –

Смежные вопросы