【Pwnable.kr】 第六题 random
源代码:
#include <stdio.h>
int main(){
unsigned int random;
random = rand(); // random value!
unsigned int key=0;
scanf("%d", &key);
if( (key ^ random) == 0xdeadbeef ){
printf("Good!\n");
system("/bin/cat flag");
return 0;
}
printf("Wrong, maybe you should try 2^32 cases.\n");
return 0;
}
解题经过
在这里虽然没有可以造成栈溢出的输入,但是查询百度之后发现:
函数rand()是真正的随机数生成器。而srand()会设置供rand()使用的随机数种子。
假设你在第一次调用rand()之前没有调用srand(),那么系统会为你自己主动调用srand()。并且自动赋值为1
所以用C写了一个测试程序
#include <stdio.h>
int main(){
unsigned int r;
r = rand();
printf("%d\n",r);
return 0;
}
其结果是

所以只要用0xdeadbeef ^ 1804289383 就是我们要输入的内容


本文解析了Pwnable.kr平台上的随机数题目,揭示了rand()函数的默认行为,即在未调用srand()时,系统将srand()自动初始化为1。通过C语言测试程序确认了这一行为,并提供了利用该特性的解题思路。
1650

被折叠的 条评论
为什么被折叠?



