我通过一门课程的工作,而且我被责成通过看和调整一些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);
答案 0 :(得分:4)
第二次调用memset
将完全覆盖第一个memset
的操作,因此第一个是多余的。
如果先将所有字节设置为0,然后将它们的子集设置为0x90
,则可能有意义。但是您要写入所有相同的字节,因此不需要第一个字节。
答案 1 :(得分:1)
您不必首先调用第一个memset
(以0x00
为值)。实际上,如果看到下一行将用不同的字节填充完全相同的内存块,我希望一个不错的编译器可以完全优化第一个调用。