【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
就是我们要输入的内容