首页
社区
课程
招聘
[求助]一段Buffer overflow的代码请指点
发表于: 2017-4-8 17:18 2912

[求助]一段Buffer overflow的代码请指点

2017-4-8 17:18
2912

有些菜,请耐心指点
问题:用户在调用gets()函数时输入什么样式的字符串,可以在不知道的原始口令“Secret”的情况下绕过该口令验证函数的限制?
1.有人说只要输入长度为24的字符串,其前12个字符和后12个字符一样即可。但是我输入24个a还是提示密码错误
2.我把gets换成fgets后不管输入的密码是对是错都提示密码错误,怎么改?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    char origPassword[12] = "Secret\0";

    char userPassword[12];

    printf("Input the password:\n");

    gets(userPassword); /* 读取用户输入的口令*/

    if(strncmp(origPassword, userPassword, 12) != 0)

    {

        printf("Password doesn't match!\n");

        exit(-1);

    }

    /* 口令认证通过时允许用户访问*/
    printf("Password is correct.\n");
    return 0;
}



[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 1305
活跃值: (228)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
2
这个你都说是溢出了,那就用溢出解这个题吧。溢出,然后jmp到printf(&quot;Password  is  correct.\n&quot;);  这里就OK
2017-4-8 17:31
0
雪    币: 112
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
要看编译器分配了多少空间。如果char  orgin[12]与char  userpwd[12]是紧密在一起的,你说的方法没问题的。
2017-4-9 01:52
0
雪    币: 522
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
        这东西    编译器不同结果就不同的            要能通过        自己下个断  看看堆栈内容  做相应调整就可以了
2017-4-17 16:59
0
雪    币: 689
活跃值: (422)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
5
已在VS2015上测试过了,你把  origPassword  和  userPassword  的地址打印出来就会发现他们之间的间距不是12个字节,而是0x20个字节,所12个a是不行的(至少在VS2015的在Debug模式下是不行的)。
2017-4-17 17:16
0
游客
登录 | 注册 方可回帖
返回
//