能否在未知目标密码时绕过scanf与strcmp验证触发权限?
能否在未知密码的情况下让这段验证代码输出"Password correct"?
完全可行,不需要知道目标密码是"secret",通过缓冲区溢出直接修改栈上的check变量即可实现。
代码栈布局分析
在check_passwd函数中,局部变量在栈上的布局(假设栈从高地址向低地址增长)大致如下:
高地址 → [check (4字节,初始值0)] [passwd[0]~passwd[5](共6字节)] ← 低地址
scanf("%s", passwd)没有限制输入长度,当输入的字符串超过6字节时,超出部分会直接覆盖栈上passwd上方的check变量内存区域。
构造输入的具体方法
我们只需要让check_passwd函数返回非0值即可触发main里的正确提示,所以构造输入时:
- 先输入6个任意字符(填满
passwd数组的6字节空间) - 再输入4字节的非0值(覆盖
check变量,将其从0改为非0,比如0x01000000,对应ASCII字符就是\x01\x00\x00\x00)
比如在终端可以用以下命令构造输入并测试:
printf 'aaaaaa\x01\x00\x00\x00' | ./your_program
此时passwd被填满6个'a',溢出的4字节将check修改为1,函数返回1,main会直接输出"Password correct",完全绕过了strcmp的密码验证逻辑。
关键逻辑说明
这里的核心是绕过strcmp的判断,直接修改决定返回值的check变量。不管输入的内容和"secret"是否匹配,只要溢出覆盖了check为非0,函数就会返回真,程序就会判定密码正确。这是典型的栈缓冲区溢出漏洞,根源在于scanf未限制输入长度,且栈上变量布局可被利用。
内容的提问来源于stack exchange,提问作者user1457958
相关产品推荐
相关产品推荐

