-5

我被困在一项任务中,该任务包括找到一个漏洞,该漏洞只是在一个循环std::unordered_set中插入一些字符串:unordered_set<string>

for (const auto& user : users_list) {
    users.insert(user);
}

有关详细信息,请参阅完整的源代码

在 UBUNTU 上编译的文件如下:

g++ -std=c++14 -O2 -Wall run.cpp -o run

任务是提供一个输入,使该程序返回一个非零状态码。

任何想法在哪里看?提示是默认散列函数存在一些问题,并且程序是在 ubuntu 上编译的。

4

1 回答 1

1

听起来您的教授希望您找到并利用哈希冲突攻击。您必须生成所有散列到相同值的输入,以便散列表查找必须strcmp使用集合的每个值查找新值,以在插入之前查看是否存在重复项。

您的下一步应该是std::string在您的系统上找到散列算法并将其反转,以便您可以生成具有相同散列值的这些输入。

或者,只是蛮力的:生成几百万或十亿个随机字符串,std::hash并将它们存储到映射到相同哈希值的字符串。

在 libstc++ HEAD 上,在此处std::hash<string>定义。它调用Hash_bytes,最后调用哈希函数是基于MurmurHashUnaligned2种子 0xc70f6907UL。

于 2019-09-30T11:28:45.007 回答