用 IDA 打开 od打开发现不会调试 白学了
找到这两个关键函数
反编译得到 代码
char *sub_401020()
{
char *result; // eax
char *v1; // [esp+50h] [ebp-CCh]
char v2; // [esp+54h] [ebp-C8h]
char v3; // [esp+5Dh] [ebp-BFh]
char v4; // [esp+94h] [ebp-88h]
char v5; // [esp+98h] [ebp-84h]
char v6; // [esp+99h] [ebp-83h]
__int16 v7; // [esp+10Dh] [ebp-Fh]
char v8; // [esp+10Fh] [ebp-Dh]
char v9; // [esp+110h] [ebp-Ch]
char v10; // [esp+114h] [ebp-8h]
int v11; // [esp+118h] [ebp-4h]
v5 = 0;
memset(&v6, 0, 0x74u);
v7 = 0;
v8 = 0;
strcpy(&v2, "********* * ** * ** ** * ** ** * #* ** **** ** *********");
v1 = &v3;
printf("Please input your key:\n");
gets(&v5);
if ( strlen(&v5) != 22 )
{
printf("Sorry you are wrong!\n");
system("pause");
exit(1);
}
v11 = 0;
do
{
v10 = *(&v5 + v11);
if ( v10 != 'k' && v10 != 'j' && v10 != 'h' && v10 != 'l' )
{
printf("Sorry you are wrong!\n");
system("pause");
exit(2);
}
v9 = *(&v5 + v11);
switch ( v9 )
{
case 'h':
if ( --v1 < &v2 || v1 > &v4 || (result = (char *)*v1, result == (char *)'*') )
{
printf("Sorry you are wrong!\n");
system("pause");
exit(3);
}
if ( *v1 == '#' )
{
LABEL_41:
printf("Good!\n");
system("pause");
exit(0);
}
break;
case 'j':
v1 += 8;
if ( v1 < &v2 || v1 > &v4 || *v1 == 42 )
{
printf("Sorry you are wrong!\n");
system("pause");
exit(3);
}
result = (char *)*v1;
if ( result == (char *)'#' )
goto LABEL_41;
break;
case 'k':
v1 -= 8;
if ( v1 < &v2 || v1 > &v4 || *v1 == 42 )
{
printf("Sorry you are wrong!\n");
system("pause");
exit(3);
}
result = v1;
if ( *v1 == '#' )
goto LABEL_41;
break;
default:
if ( ++v1 < &v2 || v1 > &v4 || *v1 == 42 )
{
printf("Sorry you are wrong!\n");
system("pause");
exit(4);
}
result = v1;
if ( *v1 == '#' )
goto LABEL_41;
break;
}
++v11;
}
while ( v11 < 25 );
return result;
}
对他进行分析
这一串 字符串肯定后面是需要的
我们输入的key 如果长度不等于 22 会直接跳出错误
所以我们应该输入 length =22
并且输入的字符必须为 k j h l 这四个中的某一个 如果不是则报错跳出
当 h 时 --相当于后退 1 且不能为* 为 * 时 跳出
如果为 # 跳出成功 !!!
当 j 时 跳 8 如果等于* 跳出
当 k 时 -8 如果等于* 跳出
其他情况就是 l 的时候 +1 也是不能等于 *
那么 我们可以讲那一串字符串 换成 8*8的矩阵
起始位置相当于 第一个空值
h相当于左移一位 (–1)
j相当于下移一位 (++8)
k相当于上移一位 (–8)
l相当于右移一位 (++1)
并且不能等于 * 走 22步 最后等于 #
那么我们直接看图走
jjjjjlllllkkkkkhhhjjjl
提交即可