美团CTF2021 高校安全挑战赛 Random

分析

首先查壳,发现没有壳32位exe,然后放入IDA中分析

image-20220426204932647

image-20220426204913349

首先看到congratulation这里,就知道条件是要v7为42,然后发现v7是在上面的if( a == 43 )这个判断语句中,分析一下。得出b这个函数不断与 byte_502138这个函数去比较,每一位,也就是说能知道这个b函数是为42个成员在里面

image-20220426205346872

然后也可以知道这个b函数就是找到flag的关键,看到最开头的部分

image-20220426205430567

要有scanf的输出也就能知道a的初始值为0,再结合这个if的条件和它对应的else语句知道这里是不断的与随机数去异或能得到flag,然后我直接去动态调试去找第一个随机数的种子

image-20220426205610063

然后开始写脚本

脚本
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
int b[]={
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};
int c=0x29;//也是第一个随机数
int flag[42]={0};
int d;
for(int i=0;i<42;i++)
{
srand(c);//设置第一个随机数种子
srand(rand());//拿第一个随机数作为第二个随机数的随机数种子
flag[i] = rand() ^ b[i];//用第三个随机数去异或
c = rand();//c放的是第四个随机数
printf("%c",flag[i]);
}
}

得到flag

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

这里基本的分析还是能动的,如果实在是不知道可以去动态调试一下看看总体的过程。然后就是对srand和rand函数的了解要深刻,这里一开始自己写脚本的时候一直错在srand和rand函数这里,后来看了别人的WP才慢慢弄懂。