pwnable.kr
查看源码
#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;
}
观察逻辑,发现需要用户输入一个key
,这个key
异或random
要等于0xdeadbeef
,而这个random
的值来源于rand()
函数,这就牵扯到rand()
的知识了。
看下菜鸟教程中对rand()
的解释
rand()
的内部实现是用线性同余法做的,它不是真的随机数,因其周期特别长,故在一定的范围里可看成是随机的。
rand()
返回一随机数值的范围在0 至 RAND_MAX
间。RAND_MAX
的范围最少是在32767
之间(int)
。用unsigned int
双字节是65535
,四字节是4294967295
的整数范围。0~RAND_MAX
每个数字被选中的机率是相同的。
用户未设定随机数种子时,系统默认的随机数种子为1
。
rand()
产生的是伪随机数字,每次执行时是相同的; 若要不同, 用函数srand()
初始化它。
也就是说事实上random
的值是固定地。。。。
我们用gdb
调试,看下random
的值
random
=0x6b8b4567
我们将random
与 0xdeadbeef
异或就可以求得 key
,0x6b8b4567 ^ 0xdeadbeef = 0xb526fb88
,但是因为key
的传入是%d
,所以要传换成十进制:3039230856
flag
= Mommy, I thought libc random is unpredictable...