Распределение и настройка памяти - PullRequest
0 голосов
/ 02 февраля 2019

Я работаю над курсом, и мне поручено просмотреть и настроить немного Си-кода.Я никогда не писал 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);

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

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

0 голосов
/ 02 февраля 2019

Второй вызов memset полностью перезапишет то, что делает первый memset, поэтому первый является избыточным.

Если вы сначала установили все байты в 0, а затем установите подмножество из них 0x90, тогда это может иметь смысл.Но вы пишете на все одних и тех же байтов, поэтому нет необходимости в первом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...