ISCC之Re2

硬核rust逆向

首先去学了一天rust。。。我TMD

IDA打开,跟踪主函数

看一下伪代码,发现有一串密文

跟进去发现一串数据,猜测有可能是flag的加密数据,于是回头去分析算法

发现一个关键点

if ( v16 == v24 )

break;

v2 = ((*(_DWORD *)(v33 + 4 * v25) >> 2) ^ 0xA) == *(_DWORD *)(v16 + 4 * v25);

++v25;

v26 += v2;

v24 -= 4LL;

这段被加密过的字符串解密方式为(data[i] >> 2) ^ 0xA,datauint32_t类型的数组,解密之后的字符串即为flag,然后会拿来和自己输入的字符串作比较。

于是我们可以根据上面的密文构造payload

#!-*-coding:utf-8 -*-
flag=[0x154,0x180,0x1FC,0x1E4,
0x1F8,0x154,0x190,0x1BC,
0x1BC,0x1B8,0x154,0x1F8,
0x194,0x154,0x1B4,0x1BC,
0x1F8,0x154,0x1F4,0x188,
0x1AC,0x1F8,0x154,0x18C,
0x1E4,0x154,0x190,0x1BC,
0x1BC,0x1B8,0x1BC,0x1B8,0x22,0x000,0x220]
decript=''
for
i in flag:
decript += chr(( i >> 2) ^0xA)
print (
decript)

最后getflag,但是算出来的flag有乱码,于是一路穷举,最后两位猜出来是下划线和点号

 

Flag: _just_need_to_get_what_is_needed_.

 

原文地址:https://www.cnblogs.com/mke2fs/p/10803913.html