下載附件打開后,發現是linux下的可執行檔案,使用IDA(64)打開,發現與二叉樹的遍歷順序有關,如圖:

可以發現type1和type2函式即為關鍵的函式,進去查看發現:
__int64 __fastcall type1(char *a1) { __int64 result; // rax if ( a1 ) { type1(*((_QWORD *)a1 + 1)); putchar(*a1); result = type1(*((_QWORD *)a1 + 2)); } return result; }
int __fastcall type2(char *a1) { int result; // eax if ( a1 ) { type2(*((_QWORD *)a1 + 1)); type2(*((_QWORD *)a1 + 2)); result = putchar(*a1); } return result; }
結合主函式我們可以知道,程式會列印出中序遍歷和后序遍歷的結果,已知一個二叉樹的中序和后序,那么我們就可以畫出這個二叉樹,而flag應該就是二叉樹先序遍歷的結果,先把程式放到linux下運行,看看結果:

中序:"2f0t02T{hcsiI_SwA__r7Ee}" 后序:"20f0Th{2tsIS_icArE}e7__w" 于是我們可以根據中序遍歷與后序遍歷的順序特征來畫出二叉樹 先序遍歷:先根,后左,再右 中序遍歷:先左,后根,再右 后序遍歷:先左,后右,再根 解決思路如下:
①根據后序(左,右,根),可以知道'w'為整個二叉樹的根節點,再根據中序遍歷,可以知道數的左邊為‘2f0t02T{hcsiI_S’,右邊集合為'A__r7Ee}'
②再根據后序遍歷的結果,可以知道對應左邊和右邊的最后一位定是根節點,也就是'w'根節點的左右孩子,即左孩子'c',右孩子'_'
③先分別左邊,對于中序遍歷結果‘2f0t02T{hcsiI_S’而言,現在'c'為根節點,故節點左邊集合為‘2f0t02T{h’,右邊為'siI_S',此時再根據對應的后序,可以知道,對于左邊,'t'為根,對于右邊'i'為根,以此類推,最終可以畫出這樣一個二叉樹,如圖:

寫出次二叉樹的先序遍歷結果:wctf2020{This_IS_A_7reE},得到flag!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/119995.html
標籤:其他
上一篇:Virtual Data Optimizer虛擬存盤優化器實戰
下一篇:Empire學習
