#include <stdio.h>
#include <stdlib.h>

typedef struct sample {
 void* data;
}sample_t;


int main()
{
    printf("Hello world!\n");
    sample_t* samplestruct = (sample_t*) malloc(sizeof(sample_t));
    samplestruct->data = (void*) malloc(10);

    free(samplestruct->data);
    free(samplestruct);
    samplestruct->data = NULL;
    samplestruct = NULL;

    return 0;
}


在上面的代码中,我同时释放了'samplestruct-> data'和'samplestruct',然后按照释放的顺序将它们都设置为NULL。现在,该代码不会使应用程序崩溃。代码有问题吗?可以以任何方式(我是说从安全角度出发)利用此漏洞吗?

最佳答案

传统上,free的实现不会更改释放的内存,直到您下次调用malloc为止。在某些平台上,这仍然是正确的(这可能是您的代码不会崩溃的原因),但是不能也不应该依靠它。即使是这样,在多线程应用程序中,刚刚释放的内存也可能是由free调用和用法之间的不同线程分配的。通常,攻击者可以使用这种竞争条件使您的指针指向其他数据,可能是由攻击者控制的数据。

不要像问题中的代码那样编写代码。

10-07 14:06