cat > multi_class_victim.cpp << EOF
#include <iostream>
#include <cstring>
class Config {
public:
char name[16];
Config() { std::strcpy(name, "SystemConfig"); }
};
class SecretData {
public:
int password;
SecretData() { password = 123456; }
};
int main() {
// 连续分配两个不同类的对象
Config* cfg = new Config();
SecretData* secret = new SecretData(); // 它是潜在的“受害者”
std::cout << "Config Address: " << (void*)cfg << std::endl;
std::cout << "Secret Address: " << (void*)secret << std::endl;
// 故意越界:Config 只有 16 字节,我们写到第 24 字节(通常会踩到 SecretData)
std::cout << "\n--- Triggering Overflow ---" << std::endl;
cfg->name[24] = 'X';
delete cfg;
delete secret;
return 0;
}
EOF
小例子仅检测到写溢出,并没有覆盖相邻对象;试试具体工程是否有覆盖情况;使用方法:保持原来编译器,加上选项-fsanitize=address就行
例子
命令(建议使用原来编译器构建)
输出