作业题两题
strcmp
ida打开 找到主函数
如果答案这么简单就好了 尝试在start函数找线索,发现其中的init函数非常可疑
该函数访问了地址off_200DF0到funcs_889 于是查看了off_200DF0到funcs_889
发现其中有sub_6E0,sub_795,sub_6A0三个函数,同时,因为
所以sub_6A0不会访问到,接着查看查看sub_6E0函数,无果,后查看sub_795函数
其中大概意思是将strcmp的地址改掉,并调用sub_6EA
于是得出,sub_6EA便是加密函数
逻辑还是比较简单的,i的值为flag的长度,(i>>3)+1为4,于是便得出结论, 循环四次,每次取8字节减上qword_201060[j]
故
解密程序:
#include<bits/stdc++.h>
using namespace std;
int main(){
char flag[]="zer0pts{********CENSORED********}";
unsigned long long key[4]={0, 0x410A4335494A0942,0x0B0EF2F50BE619F0,0x4F0A3A064A35282B};
for(int i=0;i<4;i++){
*(unsigned long long*)&(flag[i*8])+=key[i];
}
cout<<flag;
}
//zer0pts{l3ts_m4k3_4_DETOUR_t0d4y}
level4
首先ida打开
通过 puts("Practice my Data Structure code.....");
和puts("Typing....Struct.....char....*left....*right............emmmmm...OK!");
和题目提示能够推断出这书一个二叉树的数据结果,查看type1直觉上感觉是中序遍历树
在查看type2直接说明就是后序遍历
那我就知道了,这题考察已知中序遍历和后序遍历,求前序遍历。 quite simple 直接用py尝试写(第一次用py写数据结构,没想到感觉还更方便)
class TreeNode:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
def build_tree(inorder, postorder):
if not inorder:
return None
root_val = postorder[-1]
root = TreeNode(root_val)
i = inorder.index(root_val)
root.left = build_tree(inorder[:i], postorder[:i])
root.right = build_tree(inorder[i+1:], postorder[i:-1])
return root
def preorder_traversal(root):
if not root:
return ''
return root.val + preorder_traversal(root.left) + preorder_traversal(root.right)
inorder = "2f0t02T{hcsiI_SwA__r7Ee}"
postorder = "20f0Th{2tsIS_icArE}e7__w"
root = build_tree(inorder, postorder)
preorder_result = preorder_traversal(root)
print(preorder_result)
# wctf2020{This_IS_A_7reE}
标签:preorder,sub,val,inorder,write,level4,root,strcmp,postorder
From: https://www.cnblogs.com/fallrain/p/17156198.html