1、使用PEID检查新年快乐.exe是否有壳,接着用万能脱壳工具对文件进行脱壳。
2、接着用IDA打开脱壳后的文件,查看String窗口,发现了flag关键字。
3、直接F5进行反编译,查看伪代码:
逐行分析:
(1)int sub_401C10()
: 这是一个函数声明,表示定义了一个返回整数的函数。
(2)int result;
: 定义了一个整数变量 result
,用于存储函数的返回值。
(3)char v1;
, char Str1[2];
, char v3;
: 这些是字符数组,用于存储字符串和字符。v1
似乎用来存储预定义的正确标志,Str1
用来存储用户输入的标志,而 v3
则没有明显的用途。
(4)sub_401910();
: 这是一个函数调用,调用了一个函数 sub_401910()
,该函数在这段代码中没有显示出来,可能在其他地方定义。
(5)qmemcpy(&v1, "HappyNewYear!", 0xEu);
: 这行代码将字符串 "HappyNewYear!" 的内容复制到变量 v1
中,长度为 0xE (14) 个字符。
(6)*(_WORD *)Str1 = 0;
: 这将 Str1
数组的第一个字符设为 NULL 终止符,确保 Str1
是一个以 NULL 结尾的字符串。
(7)memset(&v3, 0, 0x1Eu);
: 这行代码将 v3
数组的内容全部设置为 0,长度为 0x1E (30) 个字节。
(8)printf("please input the true flag:");
: 输出提示信息,要求用户输入正确的标志。
(9)scanf("%s", Str1);
: 从用户输入中读取一个字符串,并将其存储在 Str1
中。
(10)if ( !strncmp(Str1, &v1, strlen(&v1)) )
: 使用 strncmp()
函数比较用户输入的字符串 Str1
和预定义的标志 v1
,如果它们的前 strlen(&v1)
个字符相同,则执行下面的代码。
(11)result = puts("this is true flag!");
: 如果用户输入的标志与预定义的标志相同,则输出 "this is true flag!"。
(12)else result = puts("wrong!");
: 如果用户输入的标志与预定义的标志不同,则输出 "wrong!"。
(13)最后,函数返回 result
,这个值表示用户输入的标志是否正确。
所以通过上述分析得出:当Str1输入的是:HappyNewYear! 时与v1匹配成功,返回结果为真。所以,flag{HappyNewYear! }。