关于密码破解的一道笔试题
来源:互联网 发布:数码宝贝网络侦探图鉴 编辑:程序博客网 时间:2024/04/27 16:52
下面的代码是否有密码被破解的安全问题?
int main(int argc, char *argv[]){ int flag = 0; char passwd[10]; strcpy(passwd, argv[1]); if (0 == strcmp(passwd, "password")) { flag = 1; } if (1 == flag) { printf("Login success\n"); } else { printf("Login failed\n"); } return 0;}
拿到题目,我第一个想法就是从strcpy内存写越界入手,因为passwd只有10字节,当命令行参数字符长度超过10字节时,strcpy写passwd越界,踩掉(passwd + 10)之后的内存。在vc++上,flag内存刚好是(&passwd[12]~&passwd[16])4字节。这样,通过传入长命令行参数来踩掉修改flag的值。
但是马上又有个问题:必须要将flag值踩成0x00000001,高三字节全为0x00,最低字节为0x01,argv[1]应该为“1234567890ab\x0\x0\x0\x01”这样的格式,末尾含有"\x00\x00\x00\x01"。而此时调用strcpy会遇到'\0'而结束内存拷贝,无法将flag踩成值1。
我后来想到,象这种含有常量字符串的代码,可以用反汇编工具处理结果文件之后看到.rdata/.rodata只读数据段,可以看到这些常量字符串。进而能尝试猜测出密码,密码被破解。
比如,在vc6上编译的exe,用dumpbin导出rawdata可以看到"password"字符串。
但是马上又有个问题:必须要将flag值踩成0x00000001,高三字节全为0x00,最低字节为0x01,argv[1]应该为“1234567890ab\x0\x0\x0\x01”这样的格式,末尾含有"\x00\x00\x00\x01"。而此时调用strcpy会遇到'\0'而结束内存拷贝,无法将flag踩成值1。
我后来想到,象这种含有常量字符串的代码,可以用反汇编工具处理结果文件之后看到.rdata/.rodata只读数据段,可以看到这些常量字符串。进而能尝试猜测出密码,密码被破解。
比如,在vc6上编译的exe,用dumpbin导出rawdata可以看到"password"字符串。
0 0
- 关于密码破解的一道笔试题
- 关于位运算的一道笔试题
- 一道关于字符串逆序的笔试题
- 分享一道关于素数的笔试题
- 一道关于this的笔试题
- 关于一道阿里巴巴笔试题的思考
- 关于创新工场的一道笔试题
- 一道关于字符查找的笔试题
- 关于mysql语句的一道笔试题
- 一道关于绑鞋带的笔试题
- 一道关于内存分配的笔试题
- 一道关于绑鞋带的笔试题
- 一道关于fork的笔试题
- 一道关于fork的笔试题
- 关于 ServletContext 的一道笔试题
- 关于一道javascript笔试题
- 一道笔试题 关于static
- 关于阿里巴巴一道笔试题
- MongoDB_01之在Windows上及mac上的安装与简单说明
- 今天下午花了三个小时调试出的
- IPB帧编码顺序(解码顺序)与显示顺序
- 【Java核心技术——多线程】
- python 常用知识
- 关于密码破解的一道笔试题
- Dijkstra算法详解
- ObjectARX学习笔记(九)----如何创建圆AcDbCircle
- fragmentManager中的回退栈
- CSS(层叠样式表)
- MFC状态栏显示坐标
- ORACE_常见等待事件001_enq: TX - row lock contention
- 单链表排序之快排
- POJ 2406 依然 KMP