关于密码破解的一道笔试题

来源:互联网 发布:数码宝贝网络侦探图鉴 编辑:程序博客网 时间: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"字符串。

图片
0 0