硬核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,data是uint32_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_.