无壳64位的ELF程序
放入IDA
进入函数发现
type1 中序遍历
type2 后序遍历
type3 前序遍历
在linux下运行
那这应该前序遍历就是flag
def preOrderByInPost(inorder,postorder):
if len(inorder)==0 or len(postorder)==0:
return
root_val=postorder[-1]# 根节点为后序遍历的最后一个元素
print(postorder[-1],end="")# 也就是前序遍历的第一个元素
root_index = inorder.find(root_val)
preOrderByInPost(inorder[:root_index],postorder[:root_index])
preOrderByInPost(inorder[root_index+1:],postorder[root_index:len(postorder)-1])
inorder ="2f0t02T{hcsiI_SwA__r7Ee}"
postorder="20f0Th{2tsIS_icArE}e7__w"
preOrderByInPost(inorder,postorder)
得到flag
在这之前还写了已知前序遍历和中序遍历求完整二叉树的代码
但是这题用不了,因为有重复字符,inorder.find()找根节点不准确
class TreeNode:
def __init__(self,val,left=None,right=None):
self.val=val
self.left=left
self.right=right
#已知前序遍历和中序遍历
def buildTreeForPost(preorder,inorder):
if not preorder or not inorder:
return None
root_val=preorder[0] #根节点为前序遍历的第一个元素
root=TreeNode(root_val) #构造根节点
root_index=inorder.find(root_val)#在中序遍历中找到这个根节点 列表的话使用inorder.index
#递归构建左子树和右子树
root.left=buildTreeForPost(preorder[1:1+root_index],inorder[:root_index])
root.right=buildTreeForPost(preorder[1+root_index:],inorder[root_index+1:])
return root
#已知后序遍历和中序遍历
def buildTreeForPre(inorder,postorder):
if not postorder or not inorder:
return None
root_val=postorder[len(postorder)-1] #根节点为后序遍历的最后一个元素
root=TreeNode(root_val) #构造根节点
root_index=inorder.find(root_val)#在中序遍历中找到这个根节点 列表的话使用inorder.index
#递归构建左子树和右子树
root.left=buildTreeForPre(inorder[:root_index],postorder[:root_index])
root.right=buildTreeForPre(inorder[root_index+1:],postorder[root_index:len(postorder)-1])
return root