如何绕过长度检查利用存在缓冲区溢出漏洞的C代码?
缓冲区溢出漏洞利用:绕过长度检查的方法
漏洞原理分析
这段代码的核心问题在于有符号整数与无符号整数的隐式转换:
len被定义为有符号int类型,scanf("%d", &len)会读取输入的整数(包括负数)- 当输入负数时,
if(len > 40)的判断会直接不成立(负数必然小于40),程序不会提前退出 - 但
read系统调用的第三个参数是size_t(无符号整数类型),传入的负数会被隐式转换为一个极大的无符号值,导致read向input[40]缓冲区写入远超其容量的数据,触发缓冲区溢出。
具体利用步骤
- 程序运行后,在
input length :的提示下,输入任意负数(比如-1、-100均可),此时长度检查会被绕过 - 紧接着输入超过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
相关产品推荐
相关产品推荐

