是不是做习惯了常规的逆向题目?试试这道题,看你在能不能在程序中找到真正的flag!注意:flag并非是flag{XXX}形式,就是一个’字符串‘,考验眼力的时候到了! 注意:得到的 flag 请包上 flag{} 提交
下载附件,照例扔入Exeinfo PE查看信息
32位程序,没有加壳(壳是对代码的加密,起混淆保护的作用,一般用来阻止逆向)。
IDA32打开,查看main()函数
打开一看确实不太一样
“选择一个方向,向上下左右行走”,合理猜测是一个东西在地图上行走,且v3[25]表示行数,v4表示列数。按照这个猜测,再看看具体的行走细节:
如果v3[25] >= 5或者v3[29] >= 5,那就退出;如果v7[ 5*v3[25] - 41 + v4 ]是'1',就退出;如果v7[同上]是'#',就输出正确并退出。
v3[29]是什么呢?查看前面声明变量的部分,可以看到v3是一个长为28的数组,所以v3[29]其实就是v4(“v4”这个名字就是IDA给命名的,之所以叫v4,是因为它在内存中的地址紧跟在v3后面)。如果上面的猜想成立,那么这部分意思就是“如果行数或列数不在0到4,那么就退出”。再加上v7下标中的“5*v3[25]”和“+v4”(尽管没看懂“v7”和“-41”),以及v3有值的长度正好是25,基本就可以确定 本题是在一个5*5的地图中行走,并且 flag是一个由1234组成的字符串,按照它可以从v3[0]开始,经过若干个非'1'的位置,走到一个值为'#'的位置。
那就将v3写成5*5的形式,从左上角走到'#',依此写出flag。
*1111
01000
01010
00010
1111#
222441144222
flag{222441144222}