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

452

被折叠的 条评论
为什么被折叠?



