新手一枚,如有错误(不足)请指正,谢谢!!
题目链接:攻防世界-re进阶区-Shuffle
题目下载:点击下载

IDA载入,找到main函数,F5查看伪代码
简单修改之后

int __cdecl main(int argc, const char **argv, const char **envp)
{
  time_t v3; // ebx
  __pid_t v4; // eax
  unsigned int v5; // ST18_4
  unsigned int v6; // ST1C_4
  char v7; // ST20_1
  signed int i; // [esp+14h] [ebp-44h]
  char s[40]; // [esp+24h] [ebp-34h]
  unsigned int v11; // [esp+4Ch] [ebp-Ch]

  v11 = __readgsdword(0x14u);
  s[0] = 83;
  s[1] = 69;
  s[2] = 67;
  s[3] = 67;
  s[4] = 79;
  s[5] = 78;
  s[6] = 123;
  s[7] = 87;
  s[8] = 101;
  s[9] = 108;
  s[10] = 99;
  s[11] = 111;
  s[12] = 109;
  s[13] = 101;
  s[14] = 32;
  s[15] = 116;
  s[16] = 111;
  s[17] = 32;
  s[18] = 116;
  s[19] = 104;
  s[20] = 101;
  s[21] = 32;
  s[22] = 83;
  s[23] = 69;
  s[24] = 67;
  s[25] = 67;
  s[26] = 79;
  s[27] = 78;
  s[28] = 32;
  s[29] = 50;
  s[30] = 48;
  s[31] = 49;
  s[32] = 52;
  s[33] = 32;
  s[34] = 67;
  s[35] = 84;
  s[36] = 70;
  s[37] = 33;
  s[38] = 125;
  s[39] = 0;
  v3 = time(0);
  v4 = getpid();
  srand(v3 + v4);
  for ( i = 0; i <= 99; ++i )
  {
    v5 = rand() % 0x28u;
    v6 = rand() % 0x28u;
    v7 = s[v5];
    s[v5] = s[v6];
    s[v6] = v7;
  }
  puts(s);
  return 0;
}

time是C语言获取当前系统时间的函数,以秒作单位,代表当前时间自Unix标准时间戳(1970年1月1日0点0分0秒,GMT)经过了多少秒。
形式为time_t time(time_t * t);
该函数提供两种返回方式,返回值,和指针参数。
可以根据需要选择。当参数t为空指针(NULL)时,只返回值。
而NULL的定义是(void *) 0, 所以<mark>time(0)也就是time(NULL)的另一种写法,表示只通过返回值获取时间值。</mark>
计算机没有办法产生真正的随机数的,是用算法模拟,所以你只调用rand,每次出来的东西是一样的。设置一个种子后,根据种子的不同,就可以产生不同的数了

srand(time(0)) ;//先设置种子
rand();//然后产生随机数
Srand是种下随机种子数,你每回种下的种子不一样,用Rand得到的随机数就不一样。为了每回种下一个不一样的种子,所以就选用Time(0),Time(0)是得到当前时时间值(因为每时每刻时间是不一样的了)。

srand(time(0)) ;
就是给这个算法一个启动种子,也就是算法的随机种子数,有这个数以后才可以产生随机数,
用1970.1.1至今的秒数,初始化随机数种子。

题目中说找到随机化之前的字符串
而对s[]初始化之后的代码,却是随机交换两个元素40次,所以我们只需要将初始化之后、随机化之前的数组按顺序输出即可。

写好的脚本

#include <stdio.h>
int main(void)
{
    char s[39];
  s[0] = 83;
  s[1] = 69;
  s[2] = 67;
  s[3] = 67;
  s[4] = 79;
  s[5] = 78;
  s[6] = 123;
  s[7] = 87;
  s[8] = 101;
  s[9] = 108;
  s[10] = 99;
  s[11] = 111;
  s[12] = 109;
  s[13] = 101;
  s[14] = 32;
  s[15] = 116;
  s[16] = 111;
  s[17] = 32;
  s[18] = 116;
  s[19] = 104;
  s[20] = 101;
  s[21] = 32;
  s[22] = 83;
  s[23] = 69;
  s[24] = 67;
  s[25] = 67;
  s[26] = 79;
  s[27] = 78;
  s[28] = 32;
  s[29] = 50;
  s[30] = 48;
  s[31] = 49;
  s[32] = 52;
  s[33] = 32;
  s[34] = 67;
  s[35] = 84;
  s[36] = 70;
  s[37] = 33;
  s[38] = 125;
  s[39] = 0;
  puts(s);
  return 0;
}

得到flag <mark>SECCON{Welcome to the SECCON 2014 CTF!}</mark>