RE-实验吧分道扬镳/Just Click
Alikas-0x07
分道扬镳:
file rev2.exe
rev2.exe: PE32 executable (console) Intel 80386, for MS Windows
拖进IDA看一下。
核心代码及分析如下:
v3 = 0;
memset(&v4, 0, 0x74u);
v5 = 0;
v6 = 0;
strcpy(v2, "********* * ** * ** ** * ** ** * #* ** **** ** *********");
v1 = &v2[9];//这里我修改了v2的类型,char v2 -> char v2[65],便于理解
printf("Please input your key:\n");
gets(&v3);
if ( strlen(&v3) != 22 ) // key长度为22
{
printf("Sorry you are wrong!\n");
system("pause");
exit(1);
}
v9 = 0;
do
{
v8 = *(&v3 + v9);
if ( v8 != 'k' && v8 != 'j' && v8 != 'h' && v8 != 'l' )// 以照迷宫图,这个就应该是上下左右的意思
{
printf("Sorry you are wrong!\n");
system("pause");
exit(2);
}
v7 = *(&v3 + v9);
switch ( v7 )
{
case 'h':
if ( --v1 < v2 || v1 > &v2[64] || (result = (char *)*v1, result == (char *)'*') )// 后退一步,判断越界 or 撞墙
{
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 > &v2[64] || *v1 == '*' )//越界 or 撞墙
{
printf("Sorry you are wrong!\n");
system("pause");
exit(3);
}
result = (char *)*v1;
if ( result == '#' )
goto LABEL_41;
break;
case 'k':
v1 -= 8; // 后退八步
if ( v1 < v2 || v1 > &v2[64] || *v1 == '*' )//越界 or 撞墙
{
printf("Sorry you are wrong!\n");
system("pause");
exit(3);
}
result = v1;
if ( *v1 == 35 )
goto LABEL_41;
break;
default:
if ( ++v1 < v2 || v1 > &v2[64] || *v1 == 42 )// 前进一步,再判断撞墙 or 越界否
{
printf("Sorry you are wrong!\n");
system("pause");
exit(4);
}
result = v1;
if ( *v1 == '#' )
goto LABEL_41;
break;
}
++v9;
}
while ( v9 < 25 );
return result;
函数说明:strcpy是一种C语言的标准库函数,strcpy把含有’\0’结束符的字符串复制到另一个地址空间,返回值的类型为char。*
分析代码后,这里就两种方法:
第一种遍历,求出所有可能性来求出最优解,但既费时又费力。
故我采取了第二种方法。
由于题目strcpy(v2, "********* * ** * ** ** * ** ** * #* ** **** ** *********");
已经将迷宫的大致情况给了我们,那我们直接手动还原这个8*8的迷宫即可。
********
* * *
* * ** *
* * ** *
* * #* *
* **** *
* *
********
而”j
前进八步“可理解为向前,”k
后退八步“理解为向后,”l
前进一步“为向右,”h
后退一步“为向左
目测解题法:key:jjjjjlllllkkkkkhhhjjjl
Just Click:
题目要求:拿到答案需要正确地点击按钮
拿到题后我瞎按了一下,发现,只能按9下,9下后程序会退出。
File一下:
file rev4.exe
rev4.exe: PE32 executable (GUI) Intel 80386 Mono/.Net assembly, for MS Windows
.Net文件反编译,那就用dnSpy反编译一下咯!
然后就看到这个…
照着按一下…
flag就出来了。
总结:这两道题都不是很难。知道方法就很简单。
迷宫一开始我就想到直接还原迷宫样子,结果被我猜对了。
而click则是我第一次遇到反编译.Net文件,故一开始在IDA里懵逼了好久。后来才意识到这应该是.Net文件,才去找反编译工具…tcl,学到了!