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

能否在未知目标密码时绕过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里的正确提示,所以构造输入时:

  1. 先输入6个任意字符(填满passwd数组的6字节空间)
  2. 再输入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 05:27:29