首页
社区
课程
招聘
[原创]CrackMe 用C写了个输入SN的小测试
发表于: 2010-4-23 20:19 8126

[原创]CrackMe 用C写了个输入SN的小测试

2010-4-23 20:19
8126
如题:用C语言写的,代码不足50行。
请求输入一串字符,
若输入合法,会输出:Your input is : **** , you are right!
若输入非法,则会输出:Your input is : **** , you are wrong!

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

上传的附件:
收藏
免费 0
支持
分享
最新回复 (17)
雪    币: 237
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
004013C6 jnz     short loc_4013DD
爆破在这里~~

算法我还没看懂呢~,正在阅读中~~
2010-4-23 21:21
0
雪    币: 136
活跃值: (1480)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
3
改好几个地方才能爆之,有点简单,我是小菜
2010-4-23 21:54
0
雪    币: 119
活跃值: (10)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
4
A123A411511CF6mb
2010-4-24 10:11
0
雪    币: 435
活跃值: (1282)
能力值: ( LV13,RANK:388 )
在线值:
发帖
回帖
粉丝
5
012304005AAAA6!!!.+0
我数学不太好

我咋就这么老实呢,原来可以再短一点的
2010-4-24 11:42
0
雪    币: 538
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
还可以加长

char xxx[21],
循环a, 循环b, sum, flag1;都有初始化=0;
再 scanf("%s",xxx); // 溢出
会改变 循环a, 循环b, sum, flag1;
后面只对 循环a 赋值 再用,
循环b, sum 没有再次赋初值。
2010-4-24 17:23
0
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
谢谢各位。
里面我用到了斐波契数列,从下面代码里可以看出来。
本来我是想让输入20位数字的,每四位一组,结果忘记验证输入字符>='0'&<='9'了。

#include <stdio.h>

int fun(int);
int main()
{
    char sn[21]={};
    int i=0,j=0,sum=0,flag=0;
    printf("Please input the sn:");
    scanf("%s",sn);
    for(i=1;i<7;i++)
    {
         if(sn[fun(i)]-'0'!=i)
         {
             flag=1;
             break;
         }     
    }
   
    for(i=0;i<5;i++,j+=4)
    {
        sum=sum+(sn[0+j]-'0')*1000+(sn[1+j]-'0')*100+(sn[2+j]-'0')*10+(sn[3+j]-'0')*1;
    }   
    
    if(flag==0&&sum==9595)
    {
        printf("Your input is : %s , you are right!\n",sn);
    }
    else
    {
        printf("Your input is : %s , you are wrong!\n",sn);
    }
    getche();
    return 0;
}

int fun(int i)
{
    if(i==0||i==1)
    {
        return 1;
    }
    else
    {
        return fun(i-1)+fun(i-2);
    }
}
2010-4-24 17:36
0
雪    币: 435
活跃值: (1282)
能力值: ( LV13,RANK:388 )
在线值:
发帖
回帖
粉丝
8
for(i=0;i<5;i++,j+=4)
    {
        sum=sum+(sn[0+j]-'0')*1000+(sn[1+j]-'0')*100+(sn[2+j]-'0')*10+(sn[3+j]-'0')*1;
    }   
这个循环里的 -‘0’被编译器优化掉了
变成
    for(i=0;i<5;i++,j+=4)
    {
        sum=sum+(sn[0+j])*1000+(sn[1+j])*100+(sn[2+j])*10+(sn[3+j])*1;
        sum-=53328;//正好是'0'的1111倍
    }
     
如果没优化,就不用那么累了
2010-4-24 17:54
0
雪    币: 435
活跃值: (1282)
能力值: ( LV13,RANK:388 )
在线值:
发帖
回帖
粉丝
9
[QUOTE=lmyouya;796607]还可以加长

char xxx[21],
循环a, 循环b, sum, flag1;都有初始化=0;
再 scanf("%s",xxx); // 溢出
会改变 循环a, 循环b, sum, flag1;
后面只对 循环a 赋值 再用,
循环b, sum 没有再次赋初值。...[/QUOTE]

scanf会溢出,但是没办法利用
因为很多字符没办法输入
我修改了这个pe,加进去了一个printf,然后用一个很长的字符覆盖了返回地址
勉强能执行
输入:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`1@
有兴趣的可以看看这个溢出过程
上传的附件:
2010-4-24 19:04
0
雪    币: 111
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
char UserInput[32];

int func(int i)
{
        if(i==0 || i==1)
                return 1;
       
        return func(i-1) + func(i-2) ;
}

for(int i=1;i<=6;i++)
{
        if( UserInput[ func(i) ]-'0' != i)
        {       
                Refuse=true;
                break;
        }
}
if(Refuse)
        失败
result=0;
pos=0;
for(int i=0;i<=4;i++)
{
        rec = UserInput[pos+3] + UserInput[pos+2]*10 + UserInput[pos+1]*100 + UserInput[pos+0]*1000 -0xd050;

        result += rec;

        pos += 4;
}

if(result==0x257b)
        成功
else
        失败

闷头弄完,结果发现已经有源码了,哎
2010-4-24 19:56
0
雪    币: 111
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
如果只输入数字,好像无解吧
2010-4-24 20:13
0
雪    币: 435
活跃值: (1282)
能力值: ( LV13,RANK:388 )
在线值:
发帖
回帖
粉丝
12
01230400500006003472
2010-4-24 20:32
0
雪    币: 111
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
哦,对啊,弄错了,有六位必须固定,0x257b减去固定位值,剩下的14位只要保证结果为剩余值就行
2010-4-24 23:40
0
雪    币: 119
活跃值: (10)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
14
123456
2010-4-24 23:52
0
雪    币: 11
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
for循环中的sum是做什么的啊。稍微解释下
2010-4-25 01:07
0
雪    币: 435
活跃值: (1282)
能力值: ( LV13,RANK:388 )
在线值:
发帖
回帖
粉丝
16
lz源码都放出来了 其实很简单的
把20位的serial每四位分开,共分为5个4位十进制整数
这5个整数的和为9595就ok
2010-4-25 01:07
0
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
我把SN中的字符每四个分成了一组,共五组。每组是一个十进制数,即分别为千、百、十、个位。
for循环中的语句是判断这五组十进制数的和为9595。上面我已经说了,我忘记对输入的字符进行判断了,即char>='0'&&char<='9'。
2010-4-25 09:27
0
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
那固定的六位是斐波那契数列。查一下都是哪六位,那六位数都是什么就看出来了。
2010-4-25 09:30
0
游客
登录 | 注册 方可回帖
返回
//