strcpy()漏洞举例说明

peterlilee 2016-08-07 02:49:38
[color=#FF0000]2.strcpy()函数

问:下面是一个简单的密码保护功能,你能在不知道密码的情况下将其破解吗?

[/color]
#include<stdio.h>

int main(int argc, char *argv[])
{
int flag = 0;
char passwd[10];

memset(passwd,0,sizeof(passwd));

strcpy(passwd, argv[1]);

if(0 == strcmp("LinuxGeek", passwd))
{
flag = 1;
}

if(flag)
{
printf("\n Password cracked \n");
}
else
{
printf("\n Incorrect passwd \n");

}
return 0;
}
答:破解上述加密的关键在于利用攻破strcpy()函数的漏洞。所以用户在向“passwd”缓存输入随机密码的时候并没有提前检查“passwd”的容量是否足够。所以,如果用户输入一个足够造成缓存溢出并且重写“flag”变量默认值所存在位置的内存的长“密码”,即使这个密码无法通过验证,flag验证位也变成了非零,也就可以获得被保护的数据了。例如:

$ ./psswd aaaaaaaaaaaaa

Password cracked
虽然上面的密码并不正确,但我们仍然可以通过缓存溢出绕开密码安全保护。

要避免这样的问题,建议使用 strncpy()函数。

作者注:最近的编译器会在内部检测栈溢出的可能,所以这样往栈里存储变量很难出现栈溢出。在我的gcc里默认就是这样,所以我不得不使用编译命令‘-fno-stack-protector’来实现上述方案。


上面的程序直接编译没有问题,但运行是出错。出错我觉得也是正常的,但是上面好像在讲strcpy()的漏洞,感觉好像是有什么道理在里面,但是小弟不能理解,求高手稍微解释,
...全文
333 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ooolinux 2016-08-08
  • 打赏
  • 举报
回复
可以百度 缓冲区溢出
starytx 2016-08-08
  • 打赏
  • 举报
回复
学习了
赵4老师 2016-08-08
  • 打赏
  • 举报
回复
安全都是相对的。
paschen 2016-08-07
  • 打赏
  • 举报
回复
所以微软自己搞了更安全的函数strcpy_s
libinden71 2016-08-07
  • 打赏
  • 举报
回复
学习了
lm_whales 2016-08-07
  • 打赏
  • 举报
回复
溢出攻击的目的,是覆盖返回地址,跳转到需要执行的代码位置 代码也同攻击代码放在一起。 溢出攻击本身的代码,也就数输入的数据,其实是二进制代码
wang0635 2016-08-07
  • 打赏
  • 举报
回复
如果溢出的太厉害了,不仅修改了flag的内容,怕是把main函数的返回地址也破坏了,整个程序就完了

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧