这道题简单粗暴,拖进IDA,F5大法,查看main伪C代码,如下:
int __cdecl main(int argc, const char **argv, const char **envp)
{
int result; // eax
int v4; // [esp+24h] [ebp-84h]
int v5; // [esp+30h] [ebp-78h]
char nptr; // [esp+38h] [ebp-70h]
unsigned int v7; // [esp+9Ch] [ebp-Ch]
v7 = __readgsdword(0x14u);
printf("please input the key:");
memset(&nptr, 0, 0x64u);
__isoc99_scanf("%s", &nptr);
if ( strlen(&nptr) != 4
|| (v4 = atoi(&nptr), v5 = v4 % 100 / 10, v4 % 10 + v5 + v4 / 1000 + v4 % 1000 / 100 != 23)
|| v5 / (v4 % 10) != 2
|| v4 % 1000 / 100 - v5 != -1
|| v4 / 1000 % v5 != 3 )
{
puts("wrong!");
result = 1;
}
else
{
puts("correct!");
result = 1;
}
return result;
}
简单分析得到,输入四个字符,然后通过atoi()函数转换成 int 型,再判断个位,十位,百位,千位的和为23,十位除以个位为2,百位减去十位为-1,千位对十位求余为3 时 correct !
所以我们可以直接忽略atoi(),直接输入四位整数,判断是否满足条件。上脚本(之前b,c,d,e没有换成整型都把我弄自闭了):
for a in range(1000,10000):
b = int(a%10) # 个位
c = int(a%100/10) # 十位
d = int(a%1000/100) # 百位
e = int(a/1000) # 千位
if(b==0):
continue
if(c==0):
continue
if ((b+c+d+e==23)and(c/b==2)and(d-c==-1)and(e%c==3)): # 判断条件
print(a)
结果为9563。
网友评论