能力值:
( LV2,RANK:10 )
|
-
-
2 楼
004013C6 jnz short loc_4013DD
爆破在这里~~
算法我还没看懂呢~,正在阅读中~~
|
能力值:
( LV6,RANK:80 )
|
-
-
3 楼
改好几个地方才能爆之,有点简单,我是小菜
|
能力值:
( LV9,RANK:160 )
|
-
-
4 楼
A123A411511CF6mb
|
能力值:
( LV13,RANK:388 )
|
-
-
5 楼
012304005AAAA6!!!.+0
我数学不太好
我咋就这么老实呢,原来可以再短一点的
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
还可以加长
char xxx[21],
循环a, 循环b, sum, flag1;都有初始化=0;
再 scanf("%s",xxx); // 溢出
会改变 循环a, 循环b, sum, flag1;
后面只对 循环a 赋值 再用,
循环b, sum 没有再次赋初值。
|
能力值:
( 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);
}
}
|
能力值:
( 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倍
}
如果没优化,就不用那么累了
|
能力值:
( 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@
有兴趣的可以看看这个溢出过程
|
能力值:
( 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
失败
闷头弄完,结果发现已经有源码了,哎
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
如果只输入数字,好像无解吧
|
能力值:
( LV13,RANK:388 )
|
-
-
12 楼
01230400500006003472
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
哦,对啊,弄错了,有六位必须固定,0x257b减去固定位值,剩下的14位只要保证结果为剩余值就行
|
能力值:
( LV9,RANK:160 )
|
-
-
14 楼
123456
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
for循环中的sum是做什么的啊。稍微解释下
|
能力值:
( LV13,RANK:388 )
|
-
-
16 楼
lz源码都放出来了 其实很简单的
把20位的serial每四位分开,共分为5个4位十进制整数
这5个整数的和为9595就ok
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
我把SN中的字符每四个分成了一组,共五组。每组是一个十进制数,即分别为千、百、十、个位。
for循环中的语句是判断这五组十进制数的和为9595。上面我已经说了,我忘记对输入的字符进行判断了,即char>='0'&&char<='9'。
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
那固定的六位是斐波那契数列。查一下都是哪六位,那六位数都是什么就看出来了。
|
|
|