BUUCTF Reverse/[WUSTCTF2020]level4

BUUCTF Reverse/[WUSTCTF2020]level4

BUUCTF Reverse/[WUSTCTF2020]level4_第1张图片

先看文件信息,没有加壳

BUUCTF Reverse/[WUSTCTF2020]level4_第2张图片

IDA打开找到主函数,看描述说这是一个数据结构的算法,而且有left以及rleft,这不就是数据结构里面的左子树和右子树么

BUUCTF Reverse/[WUSTCTF2020]level4_第3张图片

跟进init

BUUCTF Reverse/[WUSTCTF2020]level4_第4张图片

看一下这两个输出

BUUCTF Reverse/[WUSTCTF2020]level4_第5张图片

BUUCTF Reverse/[WUSTCTF2020]level4_第6张图片

运行一下

BUUCTF Reverse/[WUSTCTF2020]level4_第7张图片

这type1和type2就是中序遍历和后序遍历没跑,那么猜测type3就是前序遍历了,找到这个已知中序遍历和后序遍历求前序遍历 改下脚

脚本

#include 
#include 
#include 

char post[] = "20f0Th{2tsIS_icArE}e7__w"; //后序遍历结果
char mid[] = "2f0t02T{hcsiI_SwA__r7Ee}"; //中序遍历结果

void f(int root,int start,int end)
{
    if(start > end)
        return ;
    int i = start;
    while(i < end && mid[i] != post[root])
        i++;   //定位根在中序的位置
    printf("%c",mid[i]);
    f(root - 1-(end - i),start,i - 1);  //递归处理左子树
    f(root-1,i + 1,end);  //递归处理右子树
}

int main()
{

    f(24,0,24);
    return 0;
}

运行结果

BUUCTF Reverse/[WUSTCTF2020]level4_第8张图片

flag{This_IS_A_7reE}

你可能感兴趣的:(#,BUUCTF,Reverse)