BUUCTF 新年快乐

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! }。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值