BugkuCTF Take the maze

BugkuCTF
Take the maze
挺好的一题,一个box加上vm的题目
首先,查壳,无壳。
首先,先拖进ida,解析,看见
if ( sub_45E593((int)input) )
{
puts(“done!!!The flag is your input\n”);
sub_45D9C7(4);
sub_45E1B5();
}
输出flag的函数,追进去,发现
v1 = j__fopen(“flag.png”, “wb”);
j__fwrite(&unk_5409C0, 1u, 0x78Au, v1);
j__fclose(v1);
puts(“print finished,view the path to this file,you will get a png file,have a good time\n\n\n”);
这边会生成一个flag.png文件,拖进od,载入后先单步向下 遇到向上跳转就在下一行按F4,遇到调向失败的就修改z标志位,一直到跳到最后。发现生成了一个flag,png,美滋滋
得到二维码,
扫码得到:Congratulations! The flag is your input + “Docupa”
哦,好吧,不存在捷径果然。
if ( sub_45E593((int)input) )
{
puts(“done!!!The flag is your input\n”);
sub_45D9C7(a1, 4);
sub_45E1B5(a1);
}
这边有个check函数,追踪进去
发现要么返回result,要么是v5==311,那么要返回是1,就是v5=311,那v5其实就是迷宫了
之后看了下,发现输入的0,1,2,3决定了操作函数,而5,6,7,8,9,a,b,c,d,e,f则是重复的次数按照函数-次数的形式输入
switch ( byte_541168[v8] )
{
case ‘d’: // 0
sub_45CC4D((int)&v5, byte_541168[v7] - 48);
continue;
case ‘l’: // 1
sub_45D0A3(&v5, byte_541168[v7] - 48);
continue;
case ‘r’: // 2
sub_45CB0D(&v5, byte_541168[v7] - 48);
continue;
case ‘u’: // 3
sub_45D0E9(&v5, byte_541168[v7] - 48);
continue;
default:
result = 0; // gg
break;
}
之后来解析这四个操作函数:
int *__cdecl sub_462D60(int *a1, int a2)
{
int v2; // ST0C_4
int *result; // eax
int i; // [esp+E0h] [ebp-8h]

for ( i = *a1; ; i += 26 )
{
v2 = a2–; // 操作次数-1
if ( !v2 )
break;
result = (int *)(i / 26);
if ( i / 26 > 10 )
return result; // 超过10次直接返回
result = (int *)i;
if ( dword_540548[i] ^ dword_540068[i] ) // 这边俩个抑或然后返回,如果要不结束,就必须为0,就是相同
return result;
}
result = a1;
*a1 = i;
return result;
}//a1是被修改的值,如果i超过10,a1的修改失败,之后if ( dword_540548[i] ^ dword_540068[i] )是限定路径,另外发现是+26,-26,++,–
猜测是26个一行,所以这个就可以开始看了,发现能看出限定的移动的范围是x∈[1, 24] ,y∈[1, 10]。
然后可以看出来是d是下,l是左,r是右,u是下。
所以这个是操作是否能走,能走就走,不能就忽略,但是有个坑是四个函数是有四个不同的地图,所以是要分别提取地图的,就可以写出走的路径了:
06360836063b0839073e0639
然后输入,发现不对,所以会过去看,if ( sub_45B1C7() )
j__exit(0); // 反调试
if ( j__strlen(input) == 24 )
{
input[16] ^= 1u; // 24个字符
sub_45C748(input); //在这个里面是个vm
for ( i = 0; i < 24; ++i )
{
if ( (input[i] < ‘0’ || input[i] > ‘9’) && (input[i] < ‘a’ || input[i] > ‘f’) )
{
sub_45BF7D();
goto LABEL_16;
}
}
好的找到一个vm的加密,太麻烦了,动态黑盒去调试它,发现是个^的操作,之后把得到的操作字符串下得到flag
zsctf{07154=518?9i<5=6!&!v$#%.Docupa}

猜你喜欢

转载自blog.csdn.net/weixin_43225801/article/details/84883078