我正在开发一个主题为:buffe roverflow attack的系统安全项目。 我有一个程序和源代码我应该获得root权限。 我遇到的问题是由一个随机的金丝雀引起的,在程序开始时,随机数生成器被初始化:
srand(time(NULL) ^ (getpid() << 16));
稍后在金丝雀上由
设定canary = rand();
我的问题:是否有可能重建金丝雀?我想重新生成salt(time(NULL)返回自1970年以来的时间,以秒为单位,pid在程序启动时保持不变),然后通过调用rand()获取canary。 我不熟悉任何脚本语言,并且没有很多Linux经验,所以我希望不要浪费时间使用永远不会有效的解决方案。 先感谢您! :)
答案 0 :(得分:0)
是的,这是可能的。您需要知道的是程序的开始时间和进程ID。您可以通过输入ps -eo pid,cmd,lstart | grep «program-name»
从命令行获取此信息。例如,假设您感兴趣的程序名为test
:
$ ps -eo pid,cmd,lstart | grep test
26798 ./test Thu Oct 26 22:03:52 2017
输出行开头的数字是进程ID,此进程开始的时间是该行的结尾。您可以轻松地将其转换为Unix时间戳:
$ date --date='Thu Oct 26 22:03:52 2017' '+%s'
1509055432
上次我检查时,PHP仍在使用相同的随机数生成器。所以你可以用PHP来计算金丝雀:
$ php -r 'srand(1509055432 ^ (26798 << 16)); echo rand()."\n";'
1670313680
(如果你没有PHP,你可以轻松地推出自己的C应用程序来为你做这个计算。)
如果您想要生成难以猜测的值,那么srand(time(NULL))
应该是没有用的。更好的方法是从\dev\urandom
获取字节。