首页
社区
课程
招聘
[原创]2022KCTF春季赛 第九题 同归于尽
发表于: 2022-5-31 03:37 10416

[原创]2022KCTF春季赛 第九题 同归于尽

2022-5-31 03:37
10416

程序运行,要求输入32个字符,第一个字符为A,然后就进入复杂的函数调用里,首先要找到正确的输出位置,不过字符串被加密了,先找到输出语句的函数,调试即可发现是49b4ed,找引用,发现输出结果的有3个地方
图片描述
强行调用这3个printf(包括之前的解密字符串),得知47a496 是输出成功的函数调用

函数体很大,这里改用ghidra分析如何走到正确路径
图片描述
找bvar1如何赋值
图片描述
要求输入的字符里没有a-z,但是可以有其他的字符

调试时没有走到这条路径,继续往上查,就发现是(int )(unaff_EBP + 0x240) < 1,下断点调试能断下
找 unaff_EBP + 0x240 的赋值,发现是个循环比较
图片描述
得知要比较的 hex为

55 37 86 E8 9B 5D 05 F5 5F DC 04 DD E1 2A 77 21
90 7C BE 0E 68 F4 E3 60 8D 2A A8 9A FC FF BE 78

在这个函数里搜索1B0,只有3个结果
图片描述
其中465298往下就会调用一个SM4加密函数,把box倒过来用就是解密了
图片描述
解出来 FA A2 FB AE DF BA A3 C2 E3 EC 40 AF CD 4D 9E 43

观察在加密之前的输入,多次尝试发现,每2字符组合计算出1个值出来,独立计算的,可以尝试爆破2字节的组合,采取随机输入的方式

然后就爆破出一个很奇怪的解出来
AFA.AEFROAA&A-PNAMAP1<5!PO18#B16
输出成功
图片描述

 
 
 
 
 
import random
ch=[chr(i) for i in range(0x21,0x61)]+[chr(i) for i in range(0x7b,0x7f)]
length=30
 
 
pw=''
for i in range(length):
    pw=pw+ch[random.randint(0,len(ch)-1)]
print('AF'+pw)
 
T=0x30
s=[chr(i+T) for i in range(16)]
ss=""
for i in s:
    ss+=i
 
print("AF"+"#".join(s)[1:])
import random
ch=[chr(i) for i in range(0x21,0x61)]+[chr(i) for i in range(0x7b,0x7f)]
length=30

[招生]系统0day安全班,企业级设备固件漏洞挖掘,Linux平台漏洞挖掘!

收藏
免费 2
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//