BUUCTF 不一样的flag
考点:还是基础的IDA使用。
拿到题目,先打开程序。
乱按一通之后,会闪退。
Exeinfo PE打开之后,发现是32位。
IDA pro32位的打开。
shift + F12 查看字符串窗口,发现一串字符串。
双击定位。
ctrl + X 交叉引用
F5反编译后得到如下的伪代码:
int __cdecl main(int argc, const char **argv, const char **envp)
{
char v3; // [esp+17h][ebp-35h]
int v4; // [esp+30h] [ebp-1Ch]
int v5; // [esp+34h] [ebp-18h]
signed int v6; // [esp+38h] [ebp-14h]
int i; // [esp+3Ch] [ebp-10h]
int v8; // [esp+40h] [ebp-Ch]
_main();
v4 = 0;
v5 = 0;
qmemcpy(&v3, data_start, 0x19u);
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", &v6);
if ( v6 == 2 )
{
++v4;
}
else if ( v6 > 2 )
{
if ( v6 == 3 )
{
–v5;
}
else
{
if ( v6 != 4 )
LABEL_13:
exit(1);
++v5;
}
}
else
{
if ( v6 != 1 )
goto LABEL_13;
–v4;
}
for ( i = 0; i <= 1; ++i )
{
if ( *(&v4 + i) < 0 || *(&v4 + i) > 4 )
exit(1);
}
if ( *((_BYTE *)&v8 + 5 * v4 + v5 - 41) == 49 )
exit(1);
if ( *((_BYTE *)&v8 + 5 * v4 + v5 - 41) == 35 )
{
puts("\nok, the order you enter is the flag!");
exit(0);
}
}
}
我们看到if语句这个49和35有点奇怪,R字符转换之后。
分析一波,此处两个if的意思是,如果这一串代码 == 1,就异常退出。如果这一串代码 == #,就输出一句话,并正常退出。
没有思路再回去看题目的提示,发现关键点是字符串,再次寻找字符串窗口,看到一串字符串。
发现 1 和 # ,推测一波,这是不是就是迷宫的地图,
*11110100001010000101111#
把它分成5个一组得到:
*1111
01000
01010
00010
1111#
可以发现是从*开始走,走 0 不走 1,所以由上到下应该是 下下下右右上上右右下下下。
对应的数字是222441144222
走出迷宫,推测正确。