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

题目

 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}

 

posted @ 2024-06-08 22:28  demo41  阅读(9)  评论(0编辑  收藏  举报