pwnable.kr第六题:random
2018-09-13 本文已影响0人
Cookie_hunter
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...