仓库源文站点原文


title: 用 magic 变量解决 UAF 问题 date: 2024-07-10 09:06:10 updated: 2024-07-10 09:06:10 categories:


最近学到了一个很有意思的方法解决 UA(Use-After-Free) 的问题,示例代码如下

class A {
public:
    explicit A(int x): _magic(0x41), a(x) {}

    ~A() {
        _magic = 0xdead;
    }

    void print() const {
        assert(_magic == 0x41);
        cout << a << endl;
    }

private:
    unsigned _magic;
    int a;
};

int main() {
    auto a = new A(10);
    a->print();
    delete a;
    a->print();
}

简单来说就是在定义类的时候,增加一个 magic 的变量,用于记录当前的变量是否已经被释放了

同时使用了 assert 在每一个方法内判断一下是否正在执行被释放的代码

如果被释放了(示例中的代码),此时就会提示

Assertion failed: (_magic == 0x41), function print, file main.cpp, line 16.

其中可以注意到使用了 0x41 作为 magic 的默认值,也是为了解决 CPP 没有 RTTI 的问题,因为其恰好是 A 这个字母