Привет, я пытаюсь понять, как работает переполнение кучи, и я читал эту статью, которая кажется мне очень туманной. Ниже приведена страница статьи, в которой я застрял.Не понимаю, что происходит переполнение кучи 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, чтобы данные не перезаписывали «используемые», поле.
Спасибо за любой полезный ввод, чтобы очистить это.
Это намного больше имеет смысл, чем я читал в этой статье. Спасибо, я должен был прочитать этот раздел 20 раз, прежде чем сдаваться и попросить stackoverflow. –