[WUSTCTF2020]level4题解
1.查壳
NOT Win EXE - .o - ELF executable [ 64bit obj. Exe file - CPU : AMD x86-64 - OS: unspecified ]
是64位机上面的ELF文件,ELF可以在Linux上运行
2. 拖入Kali Linux运行一下
拖入kali linux运行
获得六行输出
Practice my Data Structure code.....
Typing....Struct.....char....*left....*right............emmmmm...OK!
Traversal!
Traversal type 1:2f0t02T{hcsiI_SwA__r7Ee}
Traversal type 2:20f0Th{2tsIS_icArE}e7__w
Traversal type 3: //type3(&x[22]); No way!、
观察获取一下信息:
1. Data Structure是数据结构,发现*left *right,有左右两个指针,常用数据结构中使用right和left指针的数据结构很可能是一个二叉树(Binary tree)
2.Traversal是遍历,三种遍历方式
3.看到了{},感觉像是乱序的flag
Definition for a binary tree node. struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} };
emmm,很可能是二叉树的前序遍历,中序遍历和后序遍历
如果可以猜到这个程度的话,我们知道根据中序遍历和前序遍历或者中序遍历和后续遍历可以重建二叉树
那么我们可以尝试一下所有情况,可能就能解出flag
三分逆向七分猜
还可以继续观察一下20f0Th{2tsIS_icArE}e7__w
的结尾是w,如果他是后序遍历的话,另一个已知的就是中序遍历
那么未知的前序遍历的第一个字符就是w,这个比赛是WUSTCTF,flag第一个字符应该是w
那么可以尝试用后序遍历20f0Th{2tsIS_icArE}e7__w和中序遍历2f0t02T{hcsiI_SwA__r7Ee}来求前序遍历,试着解一下flag
根据后序遍历和中序遍历求前序遍历的脚本:
def PreOrder(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="") PreOrder(Postorder[0:i],Inorder[0:i]) PreOrder(Postorder[i:length-1],Inorder[i+1:length]) PreOrder("20f0Th{2tsIS_icArE}e7__w","2f0t02T{hcsiI_SwA__r7Ee}")
运行结果为wctf2020{This_IS_A_7reE}
flag{This_IS_A_7reE}
如果没有猜到这个程度的话,继续使用IDA分析
3.拖入64位IDA分析一下
拖入64位IDA
找到main函数,按下F5反编译观察一下
除了puts,printf这些输出函数
注意观察一下init(),type1(),type2()函数
4.依次观察这几个函数
init()
发现一个字符串赋值操作,字符串为I{_}Af2700ih_secTS2Et_wr
type1()
type2()
type1,type2是两个递归函数,为了详细了解这两个函数的功能,采取动态调试
5.实现ELF动态调试
1.找到Linux附带的组件IDA附带一些组件
在dbgsrv文件夹下面
linux_server和linux_server64
2.将linux_server和要调试的文件拖入Linux当中
所调试的是32位机的二进制文件拖入linux_server
64位机拖入linux_server64
可以直接将文件拖拽到linux当中
在linux当中运行这个组件
3.在windows中的IDA选择IDA debugger
注意此方法直接打开IDA即可,不要把调试的文件拖入IDA当中,要调试的文件在远程连接的Linux虚拟机上
点击Go进入IDA
选择Remote Linux Debugger
Application:你要调试的二进制文件的完整路径
Directory:对于远程调试,此字段表示远程目录。
Parameters:传递给进程的命令行参数
Hostname:远程调试服务器主机或IP地址。
Port:远程调试服务器监听的TCP端口号。
Password:远程调试服务器所需的密码。
Application是/root/attachment
Directory是/root
这个程序没有命令行参数,不需要填写Parameters
用ifconfig查看IP,填入Hostname
Hostname是192.168.195.129
password不需要填
确保linux_server开始运行之后,可以按下OK
进入动调界面