pwnable.kr-random

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);
}

然后编译运行,

将得到的结果输入进去就可以了,

本题的视频讲解(https://www.bilibili.com/video/av46905340?t=139)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值