美文网首页
pwnable.kr第六题:random

pwnable.kr第六题:random

作者: Cookie_hunter | 来源:发表于2018-09-13 20:17 被阅读0次

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

我们将random0xdeadbeef 异或就可以求得 key ,0x6b8b4567 ^ 0xdeadbeef = 0xb526fb88,但是因为key的传入是%d,所以要传换成十进制:3039230856

flag = Mommy, I thought libc random is unpredictable...

相关文章

网友评论

      本文标题:pwnable.kr第六题:random

      本文链接:https://www.haomeiwen.com/subject/jaeggftx.html