0
点赞
收藏
分享

微信扫一扫

PWN:关于对Random函数的研究

40dba2f2a596 2022-03-10 阅读 70

random在CTF中经常出现,所以今天我想深度的研究这个函数。

srand()函数
原型:void srand(unsigned seed);
给rand()函数设置种子。

rand()函数
原型
在执行前,会先查看是否使用了srand()函数。
1.使用了srand(seed),就按照这个东西来产生随机数。
2.没有使用srand(seed),就默认使用了srand(1)来产生随机数。

time函数
原型:time_t time(time_t *timer)
timer=NULL时得到当前日历时间(从1970-01-01 00:00:00到现在的秒数)

两种用法:

  1. rand()
    返回值:一个随机值

示例代码1:没有使用srand(seed)

int targetnum=rand();
printf("%d",targetnum);

输出值不随机,是41


示例代码2:使用srand(1)

srand(1);
int targetnum=rand();
printf("%d",targetnum);

输出值不随机,是41


示例代码3:使用srand(2)

srand(1);
int targetnum=rand();
printf("%d",targetnum);

输出值不随机,是45


示例代码4:使用srand((unsigned int)time(NULL))

srand((unsigned int)time(NULL));
int targetnum=rand();
printf("%d",targetnum);

输出值随机。

  1. 例如:rand()%100
    返回值:0-99的随机值

示例代码1:没有使用srand(seed)

//srand(1);
int targetnum=rand();
int i = 0;
for(;i < 5;++i){
    int num = rand() % 20 + 1;
    printf("%d ",num);
}
printf("\n");
return 0;

输出值不随机,是8 15 1 10 5


示例代码2:使用srand(1)

srand(1);
int targetnum=rand();
int i = 0;
for(;i < 5;++i){
    int num = rand() % 20 + 1;
    printf("%d ",num);
}
printf("\n");
return 0;

输出值不随机,是8 15 1 10 5


示例代码3:使用srand(2)

srand(2);
int targetnum=rand();
int i = 0;
for(;i < 5;++i){
    int num = rand() % 20 + 1;
    printf("%d ",num);
}
printf("\n");
return 0;

输出值不随机,是17 19 16 5 11


示例代码4:使用srand((unsigned int)time(NULL))

srand((unsigned int)time(NULL));
int targetnum=rand();
int i = 0;
for(;i < 5;++i){
    int num = rand() % 20 + 1;
    printf("%d ",num);
}
printf("\n");
return 0;

输出值随机,是1-20范围内。


破解下面的程序:

random.c

#include <stdio.h>
#include <stdlib.h>
#include <time.h> 

int main()
{
    srand((unsigned int)time(NULL));
    int targetnum=rand();
    int destnum;
    printf("Please enter:\n");
    scanf("%d",&destnum);
    if(destnum==targetnum)
    {
        printf("OK\n");
    }
    else
    {
        printf("No\n");
    }
    return 0;
} 

solve.c

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<stdint.h>
#include<string.h>

int main()
{
    uint32_t rand_num;
    srand((unsigned int)time(NULL)); //seed with current time
    rand_num = rand();
    //uint32_t ans;
    printf("%d\n", rand_num);	
}

执行结果:

$ ./solve | ./random 
Please enter:
OK
举报

相关推荐

0 条评论