2021工业互联网决赛tprinter题wp

这题比赛的时候没有做出来,赛后花了2天才搞定,又学到新知识了:
IDA中看不出代码的逻辑,只有print_chk函数:
在这里插入图片描述
然后看字符串,发现一堆奇怪的格式化字符串,也不知道干啥的。
在这里插入图片描述
然后开始调试,慢慢梳理程序的逻辑,搞清楚原来程序把一些格式化字母注册了一个函数
在这里插入图片描述
当碰到printf函数中格式化字符串中有这些字母的时候,就执行对应的函数,这是一种新型的分支引擎,整个代码类似于虚拟机一样的机制来实现加密和比较。

比如C这个字母对应的是嵌套调用printf,也就是call的意思;M是赋值,A是加,S是减等等。
这样整个虚机的逻辑就渐渐清晰了
在这里插入图片描述
这里有两段VM代码,边调试边猜出来大概的逻辑就是把输入的前4个字节进行bit奇偶互换得到key,然后和0x2020cb的地方异或后判断是不是等于%25%30%2e%31(转成字符就是%0.1),然后会用key继续解密0x2020cb后面的部分,再调用printf执行。
全部的VM代码
根据这个条件计算出输入的前4个字符正好是flag,解密以后的vm代码也很长,大致逻辑也就是把输入的flag内容和0x2020cb的字符串异或,然后每4个字节一组进行异或处理,加密以后再和下面这个固定的字符串比较,如果一致就输出win,否则输出err
在这里插入图片描述
最后逆向的脚本:

b=bytes.fromhex('25302E313032344C4D25312E3137314C4D25322E304C4D253237354325302E313032344C4D25312E306C4D25312E314C')
t=bytes.fromhex('1F0A52534D7D793C2B5B06105674783A2F5907677D382B12072F417E0E0D4C0F537D790F2C69312E')
t=list(t)
for i in range(34,-1,-1):
    x=t[i:i+5]
    t[i+3]^=x[4]
    t[i+2]^=t[i+3]
    t[i+1]^=t[i+2]
    t[i+0]^=t[i+1]
for i in range(len(t)):
    t[i]^=b[i]
print(''.join(chr(i) for i in t))

测试flag成功
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值