在“C”中,从堆栈缓冲区溢出中恢复

问题描述 投票:0回答:1

这个问题超出了我的专业知识。如何在中途从“C”中的堆栈溢出溢出中恢复。 如果您使用声明为 charstring[12] 的字符变量,并且移动 12 个字符;其中只有 11 个字符的空间。现在,如何检测中途堆栈溢出溢出。如果您确实检测到超限,您如何解决问题并继续正常运行?我这样做的方式是这样的:

字符dform[12]; strcpy(dform,“2024 年 6 月 11 日”);当它应该是 strcpy(dform,"jun-11-2024") 检查日期(dform); /// 您刚刚调用了堆栈缓冲区溢出,因为您已经传递到子例程中。 /// dform 只假定保存 11 个字符而不是 12 个字符。 //// 第 12 个字符导致堆栈缓冲区溢出。

我如何在中游检测到它,如果是这样,请解决中游问题,然后 在子程序中照常进行业务,然后传回修正后的值。 谢谢

尝试过很多变通方法,但没有成功。但首先要把它消灭在萌芽状态,然后修复它并继续。这让我想起了C#的异常处理能力。

c
1个回答
0
投票

你不知道。这是致命的。

dform
包含 12 个字符,包括尾随的 null,因此您已经编写了 13 个字符。代码的其他部分很可能已经在接下来的字节中存储了一些重要的内容,一旦您覆盖了它,就没有了知道它是什么的方法。您可以很容易想象在单个字节上写入零的后果是任意糟糕的场景(例如它包含
bool avert_global_armageddon = true;
。)

如果后续字节恰好位于未映射的页面上,理论上某些系统上可以捕获 SIGSEGV 信号并恢复,因为在这种情况下实际上没有数据被覆盖。但对于像您描述的那样的错误来说,这实际上不太可能。

如果您知道如何检测溢出,请在有问题的访问之前执行此操作,如果您确定会发生溢出,请不要这样做!

如果您通过某种方式确实确定发生了缓冲区溢出等情况,则需要立即中止程序(例如

abort()
)。继续执行可能会造成更多损害(例如损坏更多内存或数据)或允许攻击者进行漏洞利用。

© www.soinside.com 2019 - 2024. All rights reserved.