180913 逆向-Flare(6-1)

magic这个题目……看的我有点花orz

主逻辑是铺好一个data,然后进行666次check
每次check如果通过的话会将data和输入进行异或,失败则会直接退出

check内部乍看非常复杂,稍微逆一下可以看出来是个结构体

标好了导入进去即可使得check函数相对清晰

整体逻辑为检查长度->解密函数->调用func进行检查输入->加密函数并将输入copy到某个变量中

如果func检查失败则会直接退出

结构体中各个域的含义如下

func -> 被解密函数的地址
xor_len -> 被解密函数的长度
index -> 要检查输入的起始下标
target_len -> 要检查输入的长度
field_10 -> 目前还没有逆到,为结尾乱序后的v4的下标
xor_data -> 解密函数的key的地址
target -> 要检查输入时用到的data

每次check有33个结构体,跑了一下,根据长度划分一共有7个子函数

{‘0x7cL’: 6, ‘0x147L’: 7, ‘0x326L’: 2, ‘0x2feL’: 2, ‘0x84L’: 8, ‘0x8fL’: 6, ‘0xb3L’: 2}

似乎没有什么好的办法来解题,只好硬着头皮挨个逆

func_0x147

按顺序开始,首先是len=0x147的func,解密出来如下

很容易看出是裴波那契数列,以输入作为下标,取值与target进行比较

由于是逐字节运算,因此打个256的表出来即可快速求解
这个很简单

func_0xb3


这个如果针对单字节也不是很复杂,同样打表反查即可
但是注意它并不是逐字节运算,而是根据a2来将所有输入涵盖进去,这个a2大的情况下就很难求解了…

查了一下,第一次check时两次对于b3的调用target_len分别为1和3,还算可以接受
仍然是爆破的思路

func_0x2fe


该函数对于input的引用仅有最后一处,全程都只是在自顾自地生成table
因此事实上这个函数等价于硬编码cmp,直接将表dump出来依次取值,甚至通过爆破jz比较可以直接将序列拿到

今天先逆这么多吧orz明天再搞剩下四个
然而关键是后面665次check,不知道会对结构体数组做什么改变……尝试爆破了一下直接报错了,还没研究怎么回事,现在见招拆招有点赌后面变化不大的意思……如果子函数每次check都变就很让人蛋疼了,只能赌出题人也是手动写函数的没法搞太多……也没别的好办法了囧硬着搞吧先

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值