题目链接 : https://buuoj.cn/challenges#reverse1
这个题我们运行的话会提示缺少 dll
IDA 载入打开字符串定位到 flag 的关键函数
我们直接 F5, 然后分析好的代码如下
__int64 sub_1400118C0()
{
char *v0; // rdi
signed __int64 i; // rcx
size_t v2; // rax
size_t v3; // rax
char v5; // [rsp+0h] [rbp-20h]
int j; // [rsp+24h] [rbp+4h]
char Str1; // [rsp+48h] [rbp+28h]
unsigned __int64 v8; // [rsp+128h] [rbp+108h]
v0 = &v5;
for ( i = 82i64; i; --i )
{
*(_DWORD *)v0 = 3435973836;
v0 += 4;
} // v0 貌似什么都没干
for ( j = 0; ; ++j )
{
v8 = j;
v2 = j_strlen(Str2); // Str2 = {hello_world} 长度 = 13
if ( v8 > v2 ) // v8 和 j 一样, 是循环计数器
break;
if ( Str2[j] == 'o' ) // 把 Str2 字符串里面的英文字母 o 替换成数字 0
Str2[j] = '0';
}
printf("input the flag:");
scanf("%20s", &Str1);
v3 = j_strlen(Str2); // 如果输入的 Str1 与替换字母之后的 Str2 完全一样的话, 就输出这个是正确的 flag
if ( !strncmp(&Str1, Str2, v3) )
printf("this is the right flag!\n");
else
printf("wrong flag\n");
sub_14001113B((__int64)&v5, (__int64)&unk_140019D00);// 不知道干啥用的, 应该是退出程序之类的
return 0i64;
}
flag{hell0_w0rld}