用 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
提交即可