0x1.首先下载附件,是个64位ELF文件。
0x2.在linux下执行该文件,输出6行字符串后程序退出。
.
0x3.使用IDA pro 64位版本加载该文件,F5反编译main函数。
需要关注的函数有3个:init()、type1()、type2()。
0x4.进入init()函数
发现一个字符串I{_}Af2700ih_secTS2Et_wr和若干地址赋值操作。
0x5.进入type1()函数
type1的参数为&unk_601290,分别对参数(8字节整数地址)的后两个值递归调用type1函数。同时在调用两个函数中间输出函数参数地址存储的字符。
0x6.进入type2()函数
行为和type1相近但是是在最后输出字符。
尝试动态调试分析,因过程略复杂,未完成。查看Writeup后解出。
P.S.:本题考查二叉树遍历算法。未能解出的原因是没有想到出题考点,对常用算法生疏。
解题方法为根据中序遍历(type1输出)和后序遍历(type2输出)结果,推导先序遍历结果。
附上 由中序遍历和后序遍历求先序遍历的递归算法:
def pre(post,mid):
length = len(post)
if length == 0:
return 0
root = post[length-1]
for i in range(length):
if root == mid[i]:
break
print(root,end=“”)
pre(post[0:i],mid[0:i])
pre(post[i:length-1],mid[i+1:length])
这里边有两个需要留意的地方:
一是后序遍历的最后一个元素是根节点;
二是先序、中序、后序遍历的原理。中序遍历的序列中根节点前面n元素同样是后序遍历序列中根节点前面n个元素;中序遍历中根节点后面的元素为后序遍历中除最后一个元素(根节点)外的元素。