Я работаю над курсом, и мне поручено просмотреть и настроить код C. Я ни дня в жизни не писал на C, однако смог освоить некоторые функции и выполнить упражнение :)
Во время упражнения я выделял память в буфере и заполнял это пространство произвольными символами. Это было частью назначения переполнения буфера.
Я изучил две функции:
malloc(size_t) - allocates memory with a size_t
memset(ptr, bytes, space) - sets shellcode into the memory
Я буду использовать этот блок кода в качестве примера:
char *nop = malloc(10);
memset(nop, 0x00, 10);
memset(nop, 0x90, 10);
Мой вопрос касается приведенного выше кода, где я резервирую место в памяти и заполняю его nops. Почему это необходимо, если это вообще необходимо, чтобы я сначала заполнил пространство нулевыми байтами, прежде чем перезаписывать нужными символами.
Будет ли следующее работать так же, или мне нужно сначала заполнить нулевыми байтами:
char *nop = malloc(10);
memset(nop, 0x90, 10);





Второй вызов memset полностью перезапишет то, что делает первый memset, поэтому первый является избыточным.
Если бы вы сначала установили все байты в 0, а затем установили их подмножество в 0x90, тогда это могло бы иметь смысл. Но вы записываете в все одни и те же байты, поэтому первый не нужен.
Вам не нужно сначала вызывать первый memset (с 0x00 в качестве значения). На самом деле, я ожидаю, что приличный компилятор полностью оптимизирует первый вызов, если он увидит, что следующая строка заполнит тот же кусок памяти другим байтом.
Потрясающе, спасибо! Первоначально код, на который я смотрел, устанавливал подмножество байтов для разных символов. Что имеет смысл!