下载后发现是 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}