rust逆向题(持续收集)
FSCTF2023 rrrrust!
看见核心数据部分
后面大致作了一些trim match 转bytes的处理
注意到这里的v60~flag
来到关键变化段
前面提到过v60~flag 而v28是对v60取了个index
看到最下面 *v28 ^= HIBYTE(v26)
由于v26的值静态找不到 所以要动调得到key
注意到这里有个v30=v65%6
猜测key的长度为6
在xor处下好断点开始动调
手动记录下HIBYTE(v26)的值:
0x58 0x46 0x46 0x54 0x6E 0x54 0x58 0x46...
可以看到这里出现了循环 故一个循环节为 [0x58 0x46 0x46 0x54 0x6E 0x54] 长度刚好为6
结合后面的check
v54数组也给了 xor key就可以得到flag了
solution.c
#include<bits/stdc++.h>
using namespace std;
signed main(){
unsigned char data[] = {
0x3E, 0x2A, 0x27, 0x33, 0x15, 0x03, 0x3D, 0x77, 0x25, 0x64, 0x03, 0x67, 0x07, 0x32, 0x76, 0x0B,
0x1C, 0x21, 0x2B, 0x32, 0x19, 0x23,0x5E,0x26,0x69,0x22,0x3B
};
int key[]={0x58,0x46,0x46,0x54,0x6E,0x54};
string flag="";
for(int i=0;i<27;i++){
flag += char(int(data[i])^key[i%6]);
cout<<flag<<"\n";
}
}
// flag{We1c0m3_t0_rust_w0r1d}