下載後發現是 file文件
因爲是逆向題目我把它放入 IDA打開
找到main函數 F5反編譯得到
int __cdecl main(int argc, const char **argv, const char **envp)
{
const char *v3; // rsi
const char **v5; // [rsp+0h] [rbp-1A0h]
int i; // [rsp+1Ch] [rbp-184h]
int v7; // [rsp+20h] [rbp-180h]
signed int j; // [rsp+24h] [rbp-17Ch]
int k; // [rsp+28h] [rbp-178h]
FILE *v10; // [rsp+30h] [rbp-170h]
_BYTE *v11; // [rsp+40h] [rbp-160h]
_BYTE *v12; // [rsp+48h] [rbp-158h]
int v13[64]; // [rsp+50h] [rbp-150h]
char v14[72]; // [rsp+150h] [rbp-50h]
unsigned __int64 v15; // [rsp+198h] [rbp-8h]
v5 = argv;
v15 = __readfsqword(0x28u);
v10 = fopen(argv[1], "r");
if ( !v10 )
__assert_fail("file!=NULL", "file.c", 0x8Fu, "main");
for ( i = 0; ; ++i )
{
v3 = "%c";
if ( (unsigned int)__isoc99_fscanf((__int64)v10, (__int64)"%c", (__int64)&v14[i]) == -1 )
break;
}
v7 = 0;
v11 = encode(flllag);
v12 = encode(sttr_home);
for ( j = 0; j <= 63; j += 2 )
{
v3 = (const char *)(unsigned int)sttr_home[j + 1];
v13[v7++] = sub_400EB9(sttr_home[j], sttr_home[j + 1]);
}
*v11 = (unsigned __int64)encode(flllag);
for ( k = 0; k < v7; ++k )
{
if ( *flllag != (k ^ v14[k] ^ v13[k]) )
{
printf("Your file is wrong!! try again", v5);
return 0;
}
++flllag;
}
*v12 = (unsigned __int64)encode(sttr_home);
printf("the flag is file's MD5 Congratulations!", v3, v5);
return 0;
}
都看不懂沒有關係 只要懂了這裏就行
題目要求 滿足
flllag[k] = k ^ v14[k] ^ v13[k]
時 輸出flag正確
那麼根據
異或操作的可逆性,v14[k] = k ^ flllag[k] ^ v13[k]
也可以看出 V7是 計算傳入字符串的長度的
分析 V13的函數 sub_400EB9():
將傳入的字符串664e06226625425d562e766e042d422c072c45692d125c7e6552606954646643
每兩位合在一起 構成十六進制數
sttr_home[0]=6
sttr_home[1]=6
6*16 相當於十六進制左移一位
發現 v13數組是sttr_home
變量數組中
函數sub_400E6A是16進制轉化爲10進制
相當於 先將字符串轉爲十六進制轉爲十進制 在構造成真正的十六進制字符
找到 sttr_home
變量數組 中傳入的字符串
經過上面的函數 sub_400EB9() 形成了十六進制字符串
這個爲v13[k]
664e06226625425d562e766e042d422c072c45692d125c7e6552606954646643
並找到傳入的flag
這個爲flllag
flag{hello_player_come_on_hahah}
接下來只需要 計算就可以了 附上腳本
strs = [0x66,0x4e,0x6,0x22,0x66,0x25,0x42,0x5d,0x56,0x2e,0x76,0x6e,0x4,0x2d,0x42,0x2c,0x7,0x2c,0x45,0x69,0x2d,0x12,0x5c,0x7e,0x65,0x52,0x60,0x69,0x54,0x64,0x66,0x43]
strss = "flag{hello_player_come_on_hahah}"
for i in range(len(strs)):
print(hex(strs[i] ^ ord(strss[i]) ^ i), end='')
輸出
我們講 0x刪去 得到
0023654619482136324823156441354665623415546215061314121320181021
此時要寫入文件了
1. 打開 十六進制編譯器 (我用的010 editor )
2.將這一串字符放入 .txt文件 並且導入 十六進制編譯器
3.在保存導出即可
我導出的爲 a.txt
之後計算 哈希值即可
按照格式 提交即可
小寫
flag{914a7b9df69eab5b74b9edb7070e53e8}