这题最终有5个队伍解出来,我比赛的时候感觉不算很难,不过比赛的那两天正好有事,大致看了下觉得有希望,但是没什么时间所以没做出来。然后过了几天再做,没想到花了近一周的时间才搞定,确实超出我的能力了。

题目给了一个附件和提示:https://en.m.wikipedia.org/wiki/Treap
看了这个,知道了Treap就是二叉树和堆的结合体,和平衡二叉树有点类似。

代码基本是全汇编写的,采用代码片段实现业务逻辑的单条指令的执行

这里是2个代码片段,实际实现的代码就这两句:

lea  rcx,[rsp+40h]
inc eax

按照官方的wp,这里的垃圾代码应该用IDA直接patch掉,变成跳转语句,这样可以用IDA直接显示业务逻辑,我当时没有patch,是用了个笨办法,把指令提取出来,然后输出到文件里,然后对这些垃圾指令进行过滤,然后得到比较清晰的汇编代码,过滤的操作代码是这样的

with open(r'g:\share\20220226\tttree\tree.log','r') as f:g=open(r'g:\share\20220226\tttree\tree1.log','w')lines=f.readlines()frame=0skip=0for l in range(len(lines)):line=lines[l].split()if line[2]=="retn":frame+=1skip=0elif line[2]=="push" and line[3]=="rax" and "pushfq" in lines[l+1]:skip=1elif line[2]=="popfq":skip=0elif skip==0:g.write(lines[l])
g.close()
with open(r'g:\share\20220226\tttree\tree1.log','r') as f:g=open(r'g:\share\20220226\tttree\tree2.log','w')lines=f.readlines()frame=0skip=0for l in range(len(lines)-1):line=lines[l].split()line2=lines[l+1].split()if line[2]=="push" and line[3]==line2[3] and line2[2]=="pop":skip=1elif skip==0:g.write(lines[l])else:skip=0
g.close()

得到的汇编代码是这样的:

根据这些汇编代码,结合Treap的文档,经过大量的脑力活动,得到代码的逻辑如下:
首先根据输入的字符串,判断前后缀是不是SUSCTF{},然后用中间的32个字符生成Treap树,每个插入的节点权重是伪随机序列生成的随机数,每个节点的值是伪随机数+对应的字符ASCII码,根节点的权重最小。

a=[0x0A2, 0x0AF, 0x09D, 0x0B7, 0x0D2, 0x0CB, 0x0C7, 0x0C6, 0x0B0, 0x0D5, 0x0DA, 0x0E3, 0x0E6, 0x0E8, 0x0E9, 0x0F3, 0x0F4, 0x0EF, 0x0EE, 0x0F7, 0x0F9, 0x0FF, 0x101, 0x0F5, 0x109, 0x11F, 0x11A, 0x146, 0x124, 0x10F, 0x106, 0x0DF]
b=[0x0A8, 0x131, 0x113, 0x047, 0x09E, 0x03B, 0x03A, 0x0BF, 0x092, 0x0F0, 0x174, 0x0C3, 0x289, 0x104, 0x260, 0x04D, 0x2FB, 0x09E, 0x191, 0x158, 0x07D, 0x04A, 0x1E9, 0x101, 0x0D0, 0x0FC, 0x070, 0x11F, 0x345, 0x162, 0x2A4, 0x092]
c=[0x0AC, 0x0FD, 0x247, 0x115, 0x0D4, 0x2B5, 0x1FC, 0x28B, 0x14A, 0x04C, 0x08E, 0x0E9, 0x055, 0x12C, 0x0F5, 0x0E3, 0x081, 0x2E2, 0x1A8, 0x117, 0x152, 0x101, 0x03A, 0x1D0, 0x0A8, 0x0CC, 0x149, 0x137, 0x300, 0x1EC, 0x276, 0x247]
addkey=[0xC1,0xA7,0xC3,0x64,0x77,0x7A,0x7F,0x73,0xAE,0xB2,0x66,0x86,0x99,0x90,0x75,0xB0,0xBC,0x8E,0xAD,0x87,0xBB,0x70,0x65,0x68,0xC0,0x7E,0xA9,0x80,0xC8,0xA5,0x9C,0x98]

最后程序验证这个树是否满足下面的条件:
判断规则:
1、所有子节点,从左->右开始遍历,每个节点的值可以和a列表对应上
2、如果第i个节点是其父节点的左节点,则第i+1个b列表的值为父节点的输入位置×23+父节点的输入字符ASCII
3、如果第i个节点是其父节点的右节点,则第i+1个c列表的值为父节点的输入位置×23+父节点的输入字符ASCII

根据这些规则首先把a列表还原成目标树,我一开始的时候完全是手工完成的,后来看了官方的wp才会根据数据所在的位置来判断树的形状
然后得到树结构以后,再根据列表b和c,从根节点开始逐个生成子节点,直至还原所有的字符。
完整的解题代码如下:

class TreapNode(object):def __init__(self, value):self.value=valueself.left = Noneself.right = Noneself.p = Noneself.weight=Noneself.slot=Noneself.ans=Nonedef create_tree(inorder,postorder):if len(postorder)==0:return Nonex=postorder[-1]pos=inorder.index(x)root=TreapNode(x)l=len(postorder)#print(len(inorder),inorder,postorder,pos,l)root.left=create_tree(inorder[:pos],postorder[:pos])root.right=create_tree(inorder[pos+1:],postorder[pos:l-1])return rootflag=[' ']*32
def walk(node):global flagflag[node.slot]=node.ansif node.left:i=(b[a.index(node.value)]-ord(node.ans))if i%23>0:print(hex(node.left.value),a.index(node.value),node.ans,i,'error')returni=i//23-1node.left.weight=rands[i]node.left.slot=inode.left.ans=chr(node.left.value-addkey[i])walk(node.left)if node.right:i=(c[a.index(node.value)]-ord(node.ans))if i%23>0:print(hex(node.right.value),a.index(node.value),node.ans,i,'error')returni=i//23-1node.right.weight=rands[i]node.right.slot=inode.right.ans=chr(node.right.value-addkey[i])walk(node.right)root=create_tree(d,a)
root.weight=min(rands)
root.slot=rands.index(root.weight)
root.ans=chr(root.value-addkey[root.slot])
walk(root)
print(''.join(flag))

SUSCTF2022的tttree逆向wp相关推荐

  1. HGAME2021部分逆向WP

    目录 week1 apacha helloRe pypy week2 helloRe2 week3 FAKE helloRe3 week4 week1 apacha 名字提示的也很明确了,TEA算法, ...

  2. 2021-i春秋-春季赛逆向WP

    2021-i春秋-春季赛 一:backdoor 参考了一些Go语言的Socket编程 https://www.cnblogs.com/yinzhengjie/p/7261584.html https: ...

  3. 站在巨人的肩膀上学习ctf vm

    0x00 前言 本文提到的vm是ctf里的vm,最近vm还是很热门的,最近的虎符,de1ctf,再到网鼎杯都有vm的身影,但是vm的知识在网上挺散的(我只找到了绿盟那篇比较系统),vm的wp也相对比较 ...

  4. hgame2020-week2-re

    hgame week2 hgame ctf week2的逆向wp 题目链接: 链接: https://pan.baidu.com/s/12tZPC3uM_tkSY50YhNUC4w 密码: fvho ...

  5. CDUT新生赛wp re方向(逆向分析

    给萌新们介绍介绍 虽然我也是大一萌新啊- https://down.52pojie.cn/Tools/ 各种工具的链接 re基础 必备工具: ida 逆向必备 不多说 jadx 安卓反编译 直接看逻辑 ...

  6. 强网杯2021 ctf线上赛ezmath wp(#超详细,带逆向新手走过一个又一个小坑)

    文章目录 引言 一.分析文件类型 二.初步分析 1 运行情况 2 IDA初步分析 三.详细分析 1 sub_13F3函数分析 2 查找蛛丝马迹 (1)mprotect (2)重写unk_2010 3 ...

  7. 实验吧逆向catalyst-system——WP

    0x0: 在linux里跑一下 要求输入用户名 密码 0x1: 拖进IDA 查看关键字符串,找到关键函数F5查看伪代码. 0x2:400C9A函数 #include<stdio.h> #i ...

  8. 2021巅峰极客逆向baby_maze题wp

    IDA分析发现题目所谓的迷宫没有一个数据结构来表示,而是每一个函数就是一关: 输入S后进入下一关: 然后一直过关到这个函数: 开始的时候我没注意看有多少个函数,以为就几十个,手工用crossref从结 ...

  9. 南邮ctf答案php是世界,南邮ctf训练平台逆向试题wp

    第一题: hint已经给的很明白了: IDA 进去 ,对那堆数字按R 就好 第二题:low_addr   rsp 0x1 0x4   相对地址 0x18 0x1c high_addr  rbp 000 ...

最新文章

  1. 7句话让Codex给我做了个小游戏,还是极简版塞尔达,一玩简直停不下来
  2. 简述html语音的概念,语音共振的概念和特点简述
  3. SharePoint工作流开发点滴(2) - 开发第一个SharePiont工作流: HelloWorldSequential 的注意事项...
  4. 前端学习(2956):项目中组件的本地注册
  5. Leetcode每日一题:976.largest-perimeter-triangle(三角形的最大周长)
  6. Mac电脑查看JDK文档,CHM格式文档阅读
  7. Axure实例:即刻 app 产品需求文档
  8. 配置telnet远程登录管理二层交换机
  9. 那年的夏天——致毕业
  10. 第二篇第一章概述及第二章生产和储存物品的火灾危险性分类 重点在于表格...
  11. Java四大引用(强、软、弱、虚)
  12. 安卓rom包解包linux,Android rom解包打包工具
  13. C/C++ 技术面试基础知识总结,包括语言、程序库、数据结构、算法、系统、网络、链接装载库等知识及面试经验、招聘、内推等信息
  14. 10行代码DIY一个类USB Rubber Ducky来遥控自己电脑
  15. windows - DirectX渲染的学习总结
  16. JCG836pro路由器刷入breed
  17. 计算机硬件英语单词 m.jb51.net,计算机硬件英汉对照表
  18. python取矩阵的一部分_Python 实现取矩阵的部分列,保存为一个新的矩阵方法
  19. 基于php的教材管理系统
  20. ps3slim安装linux,PlayStation4,硬盘更换操作

热门文章

  1. 黑马程序员-黑马程序员训练营基础测试
  2. 软件定义存储的定义与分类
  3. 打破虚拟边界的视频交互新方式,AR隔空书写的应用理念和探索实践
  4. 嵌入式驱动编写-点亮LED驱动程序
  5. 【SemiDrive源码分析】【MailBox核间通信】43 - 基于Mailbox IPCC RPC 实现核间通信(代码实现篇)
  6. 友好城市(线性dp)
  7. SpringCloud的Hystrix Dashboard、Turbine的配置
  8. 几步教会你solidworks中的爆炸视图的制作
  9. java极光推送实例
  10. Class Dictionary<K,​V>