【NISACTF】string
收获
- 注意随机数产生函数 srand(),是由函数 rand 使用的随机数发生器
在给定随机数种子 seed 时,srand(seed) 是按照种子 seed 生成伪随机数,并非真的随机,其实每次运行结果都是一样的
- 当执行产生随机数的代码时,尽量在 Linux 下执行代码,在 Windows 下产生的随机数可能会不一样
思路
拖入 IDA 查看 main 函数
输入字符串 v4,然后调用 flag() 函数
查看 flag() 函数:
在下半部分发现一段直接输出 flag 的代码:
puts("The length of flag is 13");
srand(seed);
printf("NSSCTF{");
for ( m = 0; m < 13; ++m )
{
  v4 = rand();
  printf("%d", (v4 % 8 + 1));
}
putchar(125);这里的 putchar(125) 就是输出 "}" ,for 循环内的 printf() 输出就是输出的 flag
查看种子 seed 的初值: seed = 0x2766
这里 seed = 0x2766 定义了随机数种子, srand(seed) 是按照种子 seed 生成伪随机数,并非真的随机,其实每次运行结果都是一样的
直接跑一遍代码:
#include <iostream>  
#include <string.h>  
using namespace std;  
  
int main() {  
    int v4;  
    int seed = 0x2766;  
    srand(seed);  
  
    printf("NSSCTF{");  
    for (int m = 0; m < 13; ++m) {  
        v4 = rand();  
        printf("%d", (v4 % 8 + 1));  
    }  
    putchar(125);  
}在 Windows 上的运行结果:
但是这个答案是错误的
这是一个坑点,不能使用 Windows 运行这段代码,因为生产出的随机数不一样
在 Kali Linux 上执行该代码:
编译并执行:
这个结果是正确的
脚本
#include<stdio.h>
int main()
{
	int seed = 0x2766;
	srand(seed);
	printf("NSSCTF{");
	for ( int l = 0; l < 13; ++l )
	{
		int v4 =rand();
		printf("%d", (unsigned int)(v4 % 8 + 1));
	}
	printf("}\n");
	return 0;
}结果
NSSCTF{5353316611126}
 评论

















