[WUSTCTF2020]level4题解

文章讲述了通过分析一个64位ELF文件在KaliLinux上的运行结果,识别出涉及数据结构(二叉树)和遍历方式的信息。根据中序遍历和后序遍历恢复前序遍历,从而解出flag。此外,还提到了使用IDA进行反编译和动态调试以进一步理解程序功能。
摘要由CSDN通过智能技术生成

一颗微星亦有光芒,因它不甘黯淡;一朵小花亦有芬芳,因它心向绽放。

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

进入动调界面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烨鹰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值