You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何绕过长度检查利用存在缓冲区溢出漏洞的C代码?

缓冲区溢出漏洞利用:绕过长度检查的方法

漏洞原理分析

这段代码的核心问题在于有符号整数与无符号整数的隐式转换:

  • len被定义为有符号int类型,scanf("%d", &len)会读取输入的整数(包括负数)
  • 当输入负数时,if(len > 40)的判断会直接不成立(负数必然小于40),程序不会提前退出
  • 但read系统调用的第三个参数是size_t(无符号整数类型),传入的负数会被隐式转换为一个极大的无符号值,导致read向input[40]缓冲区写入远超其容量的数据,触发缓冲区溢出。

具体利用步骤

  1. 程序运行后,在input length :的提示下,输入任意负数(比如-1、-100均可),此时长度检查会被绕过
  2. 紧接着输入超过40字节的恶意Payload:
    • 先用大量填充字节覆盖input缓冲区和栈上的旧栈帧数据
    • 覆盖栈中的返回地址为恶意代码(比如shellcode)的起始地址
    • 若环境开启栈保护或ASLR,需配合ROP(返回导向编程)等技术调整Payload

注意事项

  • 编译目标程序时需关闭栈保护与执行栈限制,例如使用GCC编译:gcc -fno-stack-protector -z execstack -o vuln vuln.c
  • 不同架构(x86/x86_64)的栈布局、字节序存在差异,需根据实际环境调整Payload的长度与内容

内容的提问来源于stack exchange,提问作者tiahsl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 21:03:19