溢出栈¶
如果你想真正迷惑分析师,你可以制造一个最终导致栈溢出的函数链,但要以间接方式:
#include <random>
typedef void (* _recurse)();
void recurse1(); void recurse2();
void recurse3(); void recurse4();
void recurse5();
_recurse recfuncs[5] = {
&recurse1, &recurse2, &recurse3,
&recurse4, &recurse5
};
void recurse1() { recfuncs[rand() % 5](); }
void recurse2() { recfuncs[(rand() % 3) + 2](); }
void recurse3() {
if (rand() % 100 < 50) recurse1();
else recfuncs[(rand() % 3) + 1]();
}
void recurse4() { recfuncs[rand() % 2](); }
void recurse5() {
for (int i = 0; i < 100; i++)
if (rand() % 50 == 1)
recfuncs[i % 5]();
recurse5();
}
// 调用上述任何函数触发栈溢出
简而言之,这些函数随机无限递归,直到调用栈上没有空间。间接造成溢出让分析师很难在意识到发生了什么之前暂停并检查之前的调用。