题目信息

解题步骤

编译器为 MSVC 19.00,对应 Visual Studio 20152017 版本。

使用ida查看:

1
2
3
4
5
6
7
8
for ( j = 0; ; ++j )
{
v10 = j;
if ( j > j_strlen(Str2) )
break;
if ( Str2[j] == 111 )
Str2[j] = 48;
}
  • Str2 是一个字符串(全局变量或常量)
  • 遍历 Str2,把所有字符 'o'(ASCII 111)替换成 '0'(ASCII 48
  • 条件是 j > j_strlen(Str2) 才跳出 → 实际是 j <= len 时继续
  • 所以这是一个 字符串预处理:将 Str2 中的 o0

Str2 是“正确 flag”的模板,但被混淆了(用 o 代替 0

1
2
sub_1400111D1("input the flag:");
sub_14001128F("%20s", Str1);
  • sub_1400111D1putsprintf 的封装(输出)
  • sub_14001128Fscanf 的封装(输入)
  • %20s:读取最多 20 个字符到 Str1
  • 所以用户输入被限制为 最多 20 字符的字符串
1
2
3
4
5
v5 = j_strlen(Str2);
if ( !strncmp(Str1, Str2, v5) )
sub_1400111D1("this is the right flag!\n");
else
sub_1400111D1("wrong flag\n");
  • j_strlen(Str2):获取 Str2 的长度
  • strncmp(Str1, Str2, v5):比较用户输入 Str1 和处理后的 Str2
  • 如果相等 → 输出 “right flag”

所以我们要查看str2

根据代码

1
2
3
4
5
6
7
8
for ( j = 0; ; ++j )
{
v10 = j;
if ( j > j_strlen(Str2) )
break;
if ( Str2[j] == 111 ) // 111 是字符 'o' 的 ASCII 码
Str2[j] = 48; // 48 是字符 '0' 的 ASCII 码
}

进行变换,得到{hell0_w0rld}

当然,也可以打个断点进行调试,直接看内容: