关于缓冲区溢出攻击的两个思考——不可以直接限制输入超过就不能输入了吗?还有就是怎么确定攻击的临近位置就有重要信息正好被覆盖呢?

我们继续用那个 “填空题试卷” 的比喻来解释。这次我们把试卷设计得更真实一些。

问题一: “不可以直接限制输入超过就不能输入了吗?”

答案是:当然应该!但为什么还是会发生呢?

因为这取决于出题老师(程序员) 是否细心。

  1. 粗心的老师(糟糕的程序员)
    他设计的试卷题目就是:“请填写你的名字: [ ]”。他没有在题目里说明字数限制,或者他说明了,但没有安排监考老师(输入检查函数) 在你写的时候检查你的答案长度。
    你写 Alexander,他就眼睁睁看着你写超了,不去阻止。这就是程序中使用了不安全的函数,比如 C 语言中的 gets() 或 strcpy(),这些函数就像没有监考老师的考场,它们会 blindly(盲目地)地把所有数据都塞进缓冲区,不管缓冲区是否装得下。

  2. 细心的老师(优秀的程序员)
    他设计的题目是:“请填写你的名字(最多5个字母): [ ]”。并且他安排了一个监考老师(输入检查函数) 站在你旁边。你刚写下第6个字母“A”,监考老师就立刻阻止你:“对不起,超长了,不能再写了!” 然后把你之前写的5个字母也擦掉,判定你这道题作弊得零分(程序报错退出)。
    程序中对应的就是使用安全函数,如 strncpy(),或者手动检查输入长度。

所以,漏洞的根本原因往往是:程序员使用了不安全的老式函数或者自己忘了做长度检查。 现代编程教育都强调必须做这个检查,但遗留的老代码中充满了这种危险。


问题二: “怎么确定攻击的临近位置就有重要信息正好被覆盖呢?”

答案是:黑客不需要知道“试卷”的精确排版,他只需要知道“考试规则”(程序运行的平台架构)就可以了。

计算机的执行方式是非常标准化、可预测的。就像全国的答题卡样式都是一样的。

  1. 标准化的“试卷排版”(内存布局)
    对于在特定系统(比如x86架构的Windows或Linux)上运行的特定程序,函数调用时栈帧的布局规则是固定的
    继续用试卷的例子:虽然每次考试内容不同,但“填空题的格子 [ ]”和“下一步的指令”之间的相对距离几乎是固定的
    比如,在32位系统上,可能规则永远是:“返回地址”就在“缓冲区”开始位置之后的第12个字节开始的地方。黑客不需要知道你的缓冲区具体在哪,他只要知道这个“偏移量”规则就行。

  2. 黑客的“试探”与“标准化攻击”
    黑客会写一个简单的测试程序,或者直接反汇编目标程序,来确认这个偏移量。一旦他知道了偏移量,他就能构造出精准的攻击输入。
    他的攻击输入看起来是这样的:
    [垃圾数据填满缓冲区][更多垃圾数据覆盖掉其他不重要的东西][精确指向恶意代码的地址]
    他通过不断“试探”(一种叫fuzzing的技术)来找到崩溃点,然后根据崩溃信息分析出准确的偏移量。

  3. “蒙眼射击”变成“卫星制导”
    您的感觉没错,早期这有点像“蒙眼射击”,需要尝试很多次。但一旦黑客通过分析掌握了“试卷的标准格式”(程序的内存布局),他的攻击就变成了“卫星制导的精准打击”
    他构造的攻击数据就像一份自适应的试卷答案:前面部分用于填满空间,最后一部分正好精准地覆盖在“下一步指令”那个格子上,把它改成“请执行试卷开头我写的那些指令”。

现代系统的防御(ASLR)
正是因为这种布局的可预测性太危险,现代操作系统采用了一种叫地址空间布局随机化 的技术。
这相当于:每次考试,不仅考题会变,整张试卷的排版都会随机变化。今天“下一步指令”在填空题下面,明天可能就跑到试卷背面去了。这让黑客很难再预测关键信息的位置,极大地增加了攻击难度。但攻击者仍在寻找绕过ASLR的方法,这场攻防战一直在持续。

总结回答您的两个问题:

  1. 能限制吗? 能。但程序员犯的错(用了不安全的函数或忘了检查)为攻击打开了大门。

  2. 怎么确定位置? 依靠计算机系统标准化的内存布局规则。黑客通过分析和试探来掌握这个规则,从而实现精准覆盖。而现代防御技术(如ASLR)则试图打破这种可预测性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xixixi77777

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值