pwnable.kr-random
这个是(https://pwnable.kr)中第6个题,比较简单。ssh连接后,直接运行里面可执行文件random,随便输入几个数,提示你应该尝试2的32次幂,直接看源码吧。
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;
}
定义了一个无符号的整数random,并通过rand()函数赋值,key的值是我们自己输入的。他要求key的值与random的值异或的结果为0xdeadbeef。
这里介绍一下异或操作,异或(xor)是一个数学运算符,他应用于逻辑运算,异或的数学符号为“⊕”,计算机符号为“xor”。如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。运算法则如图
所以自己输入的key可以通过random的值与0xdeadbeef异或求出,但是这个random是一个随机的整数,这怎么办呢?其实,rand()函数产生的是一个伪随机数,库函数中系统提供了两个函数用于产生随机数:srand()和rand()。原型为:
函数一:int rand(void);
返回一个[0,RAND_MAX]间的随机整数,RAND_MAX 是stdlib.h 中定义的一个整数,它与系统有关
函数二:void srand(unsigned seed);
参数seed是srand()的种子,用来初始化srand()的起始值。
系统在调用rand()之前都会自动调用srand(),如果在srand()里给参数seed指定了一个值,那么 rand()就会将seed的值作为产生伪随机数的初始值;而如果用户在rand()前没有调用过srand(),那么系统默认将1作为伪随机数的初始值,如果初始值是此时的1或是其他定值,那么每次rand()产生的随机数序列都是一样的,这也就是所谓的“伪随机数”。
大家可以自己写一个小程序跑一下,看看每次执行的是不是同一个值。通过查资料和自己写程序验证,确实每次运行的时候random都是一样的,所以在linux系统下写一个程序。
#include<stdio.h>
#include<stdlib.h>
int main(){
unsigned int random;
random=rand();
printf("%d\n",random);
printf("%u\n",random ^ 0xdeadbeef);
}
然后编译运行,
将得到的结果输入进去就可以了,