不一样的flag 1:
首先题目提示这是不一样的flag,然后我们就带着提示。下载 文件。 得到一个.exe文件然后就先用PE查看一下文件信息:
看到文件信息是没有加密的而且还32位的文件,所以直接用IDA 打开得到:
然后用:shift+F12 得到:
看到这里有个:is the flag 双击它得到:
在双击红色地方得到:
在选中这部分,按下F5键得到,伪源码:
int __cdecl __noreturn main(int argc, const char **argv, const char **envp)
{
char v3[29];
int v4;
int v5;
int i;
_BYTE v7[12];
__main();
v4 = 0;
strcpy(v3, "*11110100001010000101111#");
while ( 1 )
{
puts("you can choose one action to execute");
puts("1 up");
puts("2 down");
puts("3 left");
printf("4 right\n:");
scanf("%d", &v5);
if ( v5 == 2 )
{
++*(_DWORD *)&v3[25];
}
else if ( v5 > 2 )
{
if ( v5 == 3 )
{
--v4;
}
else
{
if ( v5 != 4 )
LABEL_13:
exit(1);
++v4;
}
}
else
{
if ( v5 != 1 )
goto LABEL_13;
--*(_DWORD *)&v3[25];
}
for ( i = 0; i <= 1; ++i )
{
if ( *(int *)&v3[4 * i + 25] < 0 || *(int *)&v3[4 * i + 25] > 4 )
exit(1);
}
if ( v7[5 * *(_DWORD *)&v3[25] - 41 + v4] == 49 )
exit(1);
if ( v7[5 * *(_DWORD *)&v3[25] - 41 + v4] == 35 )
{
puts("\nok, the order you enter is the flag!");
exit(0);
}
}
}
对这个伪代码进行分析: 得到关键代码: 这里的49的ascll编码是:1; 35的ascll编码是:#; 当等于#时,根据英语翻译,我们知道输入的值的顺序就是flag
其中 exit(1)表示异常退出.这个1是返回给操作系统的不过在DOS好像不需要这个返回值 exit(0)表示正常退出
而我们在启动程序得到的是:
可以看到这是一个:选择方向,应该是走迷宫 1 是向上 2 是向下 3 是向左 4 是向右
我们在查看源码发现:
发现这里的V3被赋予了:*11110100001010000101111#
发现这串字符可以分为5行5列:
*1111
01000
01010
00010
1111#
发现他有0和1,和# 这个应该就是迷宫了 要求我们从*走到#就 不走向1,否则退出
所以我们的顺序是:222441144222
所以得到flag: flag{222441144222}
|