新手一枚,如有错误(不足)请指正,谢谢!!
题目链接:攻防世界-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>