-
-
XCTF攻防世界guess_number
-
发表于:
2019-10-1 19:55
9127
-
首先进行程序基本信息检查:
看起来是正常程序,大概就是输入一个name,然后输入一个数字,相匹配就成功。(初步猜测是随机数233333)
ida查看一下源代码:
很幸运,程序没有进行混淆或者反调,直接看到了真实的源代码。在main函数里,我们注意到有一个gets()函数,这是一个危险函数,很可能会出问题。
继续往下看,下面的for循环是处理输入的数字部分,果然是一个随机数字,猜对了。在这里,有一个if判断,我们是否可以进行覆盖使判断条件成立直接执行到success?不能,因为程序开启了cannary,没办法进行覆盖。
最后在输入正确的数字后会执行一个sub_C3E()函数,进入函数查看:
直接执行了"cat flag"。
总结一下,我们就是要输入正确的随机数,然后让程序执行到sub_C3E()函数,就可以看到flag了。那么如何猜对随机数字呢?
需要注意在产生随机数的前面有个gets()函数,而且没有对输入的字符长度进行限制。来看一下栈中的情况:
我们可以通过var_30对seed进行覆盖,这样一来生成的随机数就变成我们已知的了。
具体实现:
exp:
最终获取到flag:
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!