【问题标题】:Double Free - crash or no crash双免费 - 崩溃或不崩溃
【发布时间】:2016-04-17 12:16:32
【问题描述】:

谁能解释一下为什么连续释放a 两次会导致崩溃,但先释放a,然后释放b,然后再次释放a 不会崩溃?

我知道 free 会将堆块插入到双链空闲列表中。释放两次会在空闲列表中插入两次相同的块。但是为什么会发生崩溃呢?

int *a = malloc(8);
int *b = malloc(8);

free(a);

// free(a); // Would crash!

free(b);

free(a); // No crash.

【问题讨论】:

  • Infosec 可能不是这个问题最合适的论坛。考虑 StackOverflow。
  • 为什么总是崩溃?即使int a[5]; a[10] = 100; 也不会总是崩溃。
  • 了解什么是未定义的行为。你最终会不止一次遇到它。

标签: linux exploit c glibc


【解决方案1】:

因为在 C 语言中,未定义的行为 就是:未定义。任何事情都有可能发生。

另见man 3 free:

[...] 如果之前已经调用过 free(ptr),则会发生未定义的行为。

【讨论】:

    猜你喜欢
    • 2022-12-09
    • 2012-03-29
    • 2011-11-22
    • 1970-01-01
    • 2022-11-02
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    相关资源
    最近更新 更多