buu-[WUSTCTF2020]level4

该博客主要介绍了WUSTCTF2020挑战level4的问题,涉及64位ELF文件。通过分析Traversal type 1和2的字符串,得出它们分别对应二叉树的中序遍历和后序遍历。进一步推理,Traversal type 3应为先序遍历。作者通过IDA查看了字符串和main函数,并尝试理解二叉树的结构,虽然未完全理解,但提供了自行计算或搜索解决的建议。

64位elf文件
在这里插入图片描述
先运行
在这里插入图片描述
Traversal type 1:2f0t02T{hcsiI_SwA__r7Ee}
Traversal type 2:20f0Th{2tsIS_icArE}e7__w
Traversal type 3: //type3(&x[22]); No way!

ida查看字符串无恙
查看main函数

int __cdecl main(int argc, const char **argv, const char **envp)
{
  puts("Practice my Data Structure code.....");
  puts("Typing....Struct.....char....*left....*right............emmmmm...OK!");
  init("Typing....Struct.....char....*left....*right............emmmmm...OK!", argv);
  puts("Traversal!");
  printf("Traversal type 1:");
  type1(&unk_601290);
  printf("\nTraversal type 2:");
  type2(&unk_601290);
  printf("\nTraversal type 3:");
  puts("    //type3(&x[22]);   No way!");
  puts(&byte_400A37);
  return 0;
}

type1

__int64 __fastcall type1(char *a1)
{
  __int64 result; // rax

  if ( a1 )
  {
    type1(*((_QWORD *)a1 + 1));
    putchar(*a1);
    result = type1(*((_QWORD *)a1 + 2));
  }
  return result;
}

type2

int __fastcall type2(char *a1)
{
  int result; // eax

  if ( a1 )
  {
    type2(*((_QWORD *)a1 + 1));
    type2(*((_QWORD *)a1 + 2));
    result = putchar(*a1);
  }
  return result;
}

type1为二叉树中序遍历
type2为二叉树后序遍历
那么type3就是先序遍历了

init里也能看到二叉树的结构,暂时没看懂(
在这里插入图片描述
自己算也行,小手一搜也行

def ToPreOrder(Postorder,Inorder):
    length = len(Postorder)
    if length == 0:
        return 0
    root = Postorder[length-1] #根节点 
    for i in range(length):#找到中序遍历中根节点的位序
        if root == Inorder[i]:
            break
    print(root,end="")
    ToPreOrder(Postorder[0:i],Inorder[0:i]) #递归,传入左子树的后序和中序遍历序列
    ToPreOrder(Postorder[i:length-1],Inorder[i+1:length])#递归,传入右子树的后序和中序遍历序列
    
ToPreOrder("20f0Th{2tsIS_icArE}e7__w","2f0t02T{hcsiI_SwA__r7Ee}")
print("\n")

在这里插入图片描述
flag{This_IS_A_7reE}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值