首页 > 其他分享 >window下的随机数与随机数种子——[MTCTF 2021]Random

window下的随机数与随机数种子——[MTCTF 2021]Random

时间:2024-06-08 22:33:05浏览次数:10  
标签:rand 0xE9 Random 0xF2 MTCTF 异或 v4 随机数

题目

 Die 

 IDA 

main函数

 dword_1B336C 与 v7 ,是两个记录循环次数的计数器

红框:加密逻辑,很简单

绿框:成功条件,需要满足两个,第一个是 dword_1B336C == 43 ,当 dword_1B336C 不等于43的时候进入else,然后需要满足条件 input[v9] == key[v8] 与 v7 == 42 

 

key

  0x3E, 0xCD, 0xAA, 0x8E, 0x96, 0x1F, 0x89, 0xCD, 0xDB, 0xF1, 
  0x70, 0xF2, 0xA9, 0x9C, 0xC2, 0x8B, 0xF2, 0xFE, 0xAD, 0x8B, 
  0x58, 0x7C, 0x2F, 0x03, 0x4A, 0x65, 0x31, 0x89, 0x76, 0x57, 
  0x88, 0xDF, 0xB8, 0xE9, 0x01, 0xE9, 0xDE, 0xE5, 0x86, 0x68, 
  0x8F, 0x24, 0xD3, 0x5A

 

第一种解题方法

编写逆向脚本时,需要注意下面的代码

在满足第一个条件的循环中,里面又调用了mian函数

 这里通过动调给大家看看顺序

做好断点标记

第一轮运行main

第一次进行rand(),及srand()

 第一轮main中调用mian

 F7,进去第二轮main

在进行第二次异或操作前,进行了第二次rand(),及srand()

综上,在两次异或操作之间,夹着两组and(),及srand(),使用第二个随机数设置种子并生成第三个随机数,用于第二轮异或操作

EXP1

#include<stdio.h>
#include<stdlib.h>
void main() {
    unsigned int  v4, v6;
    unsigned char v5;

    unsigned char ida_chars[] =
    {
      0x3E, 0xCD, 0xAA, 0x8E, 0x96, 0x1F, 0x89, 0xCD, 0xDB, 0xF1,
      0x70, 0xF2, 0xA9, 0x9C, 0xC2, 0x8B, 0xF2, 0xFE, 0xAD, 0x8B,
      0x58, 0x7C, 0x2F, 0x03, 0x4A, 0x65, 0x31, 0x89, 0x76, 0x57,
      0x88, 0xDF, 0xB8, 0xE9, 0x01, 0xE9, 0xDE, 0xE5, 0x86, 0x68,
      0x8F, 0x24, 0xD3, 0x5A
    };

    for (int i = 0; i < 44; i++) {
        v4 = rand();     // 生成第一个随机数
        srand(v4);       // 使用第一个随机数设置种子
        v4 = rand();     // 生成第二个随机数
        srand(v4);       // 使用第二个随机数设置种子
        v4 = rand();     // 生成第三个随机数
        v5 = ida_chars[i] ^ v4; // 进行异或操作
        printf("%c", v5); // 输出结果字符
    }
}

 

第二种解题方法

如果你实在是摸不清到底有几组rand于srand,可以试试这个手搓方法

加密操作重点是与随机数异或,那如果我们能得到每次进行随机数呢?

在关键代码上断点

 随机输入一串

第一次异或

随机数存放在 al 里,查看eax最后两位的值: 0x58 

 第二次异或: 0xA1 

第三次异或: 0xCB 

 以此类推,得到43个随机数

0x58,0xa1,0xCB,0xE9,0xED,0x2C,0xEC,0xFB,0xE9,0xC4,0x16,0x97,0x99,0xb1,0xa4,0xe9,0xc3,0xc6,0x80,0xBF,0x3e,0x44,0x18,0x2e,0x73,0x56,0x52,0xB8,0x5B,0x66,0xED,0xBC,0x8a,0xd8,0x36,0x8f,0xe6,0xd3,0xb1,0x51,0xb9,0x59,0xd3,0x5a

EXP2

rand_num = [0x58,0xa1,0xCB,0xE9,0xED,0x2C,0xEC,0xFB,0xE9,0xC4,0x16,0x97,0x99,0xb1,0xa4,0xe9,0xc3,0xc6,0x80,0xBF,0x3e,0x44,0x18,0x2e,0x73,0x56,0x52,0xB8,0x5B,0x66,0xED,0xBC,0x8a,0xd8,0x36,0x8f,0xe6,0xd3,0xb1,0x51,0xb9,0x59,0xd3,0x5a]
key=[0x3E, 0xCD, 0xAA, 0x8E, 0x96, 0x1F, 0x89, 0xCD, 0xDB, 0xF1, 0x70, 0xF2, 0xA9, 0x9C, 0xC2,
0x8B, 0xF2, 0xFE, 0xAD, 0x8B, 0x58, 0x7C, 0x2F, 0x03, 0x4A, 0x65, 0x31, 0x89, 0x76, 0x57, 0x88,
0xDF, 0xB8, 0xE9, 0x01, 0xE9, 0xDE, 0xE5, 0x86, 0x68, 0x8F, 0x24, 0xD3]
flag = ""
for i in range(len(key)):
    flag += chr(key[i] ^ rand_num[i])
print(flag)

flag

flag{3e625fe0-fb18-4f87-93c1-1ec217f86796}

 

标签:rand,0xE9,Random,0xF2,MTCTF,异或,v4,随机数
From: https://www.cnblogs.com/demo41/p/18239045

相关文章

  • 25、matlab随机数生成汇总:控制随机数生成器、均匀分布和正态分布的随机数
    1、rng:控制随机数生成器语法rng(seed,generator)还指定随机数生成器要使用的算法。参数seed:随机数种子    s:随机数生成器设置generator:随机数算法"twister"|"simdTwister"|"combRecursive"|"multFibonacci"|"philox"|"threefry"1)设......
  • CF1743D Problem with Random Tests
    题目链接:https://codeforces.com/contest/1743/problem/D这题比较考察做题的经验因为或操作对一个数的值只增不减,所以我们要往高位考虑.我们截取的第一段需要满足最高位的1在原串中也是最高位的1,这样才能做到别的所有的数都不如他大.截取的第二段需要能首先满足把第一段截取......
  • 编写程序,创建一个集合Set,其中含有100个元素,每个元素是0~1000之间的一个随机数。打印
    实验代码: importrandomasrSet=set()foriinrange(100):num=r.randint(0,1000)Set.add(num)#使用列表推导式和join方法来输出结果print('{'+','.join(str(i)foriinSet)+'}')iflen(Set)==100:print("随机数没有出现重复!")......
  • 【Python快速上手(三十)】- 详解Python random 模块和 statistics 模块
    目录Python快速上手(三十)-详解Pythonrandom模块和statistics模块1.Pythonrandom模块1.1生成随机数1.2随机选择和打乱1.3随机分布1.4种子和状态2.Pythonstatistics模块2.1均值和中位数2.2众数2.3方差和标准差2.4协方差和相关性2.5分位数和百分位数2.6......
  • random和range
    含义:random(1,10)不包含10,用于生成随机数。它可以生成浮点数或整数,取决于具体的使用方式。range(0,1)不包含1,用于生成一个整数序列。它可以生成一个指定范围内的连续整数序列。区别在于:random()生成的数是随机的,每次调用可能得到不同的结果。而range()生成的数是连续的......
  • 随机数
    前言典例剖析【人教2019A版教材\(P_{177}\)页练习第4题】如果计算器只能生成\([0,1)\)内的随机数,如何将它转化为\(1\sim100\)范围内的整数随机数,如何转化为\(1\sim712\)范围内的整数随机数?提示:在演示软件Desmos中,函数\(random()\)能产生\([0,1)\)的随机数,......
  • 总结全网C#取随机数方法(整型,浮点型,字符串)
    原文链接:https://blog.csdn.net/m0_65636467/article/details/127770112C#取随机数(Random篇)一、整数随机数//10以内的随机整数Randomrd=newRandom();intn=ran.Next(10);//1-100的随机整数intp=rd.Next(1,100);//大于等于1小于100的整数intNext(intmi......
  • NumPy 随机数据分布与 Seaborn 可视化详解
    随机数据分布什么是数据分布?数据分布是指数据集中所有可能值出现的频率,并用概率来表示。它描述了数据取值的可能性。在统计学和数据科学中,数据分布是分析数据的重要基础。NumPy中的随机分布NumPy的random模块提供了多种方法来生成服从不同分布的随机数。生成离散分布随......
  • NumPy 数组排序、过滤与随机数生成详解
    NumPy数组排序排序数组排序数组意味着将元素按特定顺序排列。顺序可以是数字大小、字母顺序、升序或降序等。NumPy的ndarray对象提供了一个名为sort()的函数,用于对数组进行排序。示例:importnumpyasnparr=np.array([3,2,0,1])print(np.sort(arr))输出:[0......
  • [SWPUCTF 2021 新生赛]fakerandom 关于random.seed的一些事
    最近开始接触reverse了,难得有些力不从心(本质还是汇编看不懂),来看看这道题吧。点击查看代码importrandomflag='xxxxxxxxxxxxxxxxxxxx'random.seed(1)l=[]foriinrange(4):l.append(random.getrandbits(8))result=[]foriinrange(len(l)):random.se......