2022DASCTF X SU 三月春季挑战赛 easyre

链接:https://pan.baidu.com/s/1TMYsvwPn6SXt4NmE74N3Dg
提取码:tuyt

首先拿到文件,用exe去看看有没有加壳

image-20220401211248926

发现这是asp的壳,我们就用

未命名图片

把它去壳,去壳之后放入IDA进行分析

首先shift+12去看有没有什么线索

image-20220401211510960

发现这里有个right于是我们双击进去看看,然后Ctrl+x去看看它调用了些什么函数

image-20220401211614169

image-20220401211728152我们一个个分析,sub_401500()这个函数里头

image-20220401211834242

表示的是定义了b这个数组有256个元素

sub_40152B()这个函数

image-20220401211943375

这里的sub_41A038(v1)这个函数可以知道就是v3,从最后的for循环很容易得到v3=42

image-20220401212023001

所以result=42;

这里可以猜测v1是密匙,因为他是用的strcpy函数,我们就写一个脚本,看一下它这个ASCII码会转换成什么

image-20220401212122903

可以发现密匙为[49,50,51,52,53,54]

然后这里最后的*(dword_492440 + i) = result,*(dword_492440 + i)先放着,继续往下看

sub_401593()函数

image-20220401212715832

这里的交换,与256的循环以及前面的b[256]可以判断出来这是一个RC4的加密

sub_401619(a1, v3)函数

image-20220401213146901

这是一个加密的算法,画圈部分将它简化放入for循环中当条件为a–,这里dword_492940数组就是外面的for循环中的数组,于是我们去外面看看

image-20220401213255132

image-20220401213343871这里的LOBYTE(dword_492940[i]表示的是这个数组的低八位

image-20220401213429642

然后这个*(dword_492A60 + i)就是v2数组

*(i + a1)这个表示的是a1[i]也是我们要求的,那么这个语句的逆向结果为

a[i]=(v2[i]-71)^(dword_492940[i] & 0xff);

那我们开始写脚本

#include<iostream>

#include<stdint.h>

using namespace std;

int s[256];

char t[256];

int k[50];

void swap(int* a, int* b) {

uint8_t tmp;

tmp = *a;

*a = *b;

*b = tmp;

}

void Rc4_Init(uint8_t* key, uint32_t klen) {

int i, j;

for (i = 0; i < 256; i++) {

s[i] = i;

t[i] = key[i % klen];

}

j = 0;

for (i = 0; i < 256; i++) {

j = (j + s[i] + t[i]) % 256;

swap(&s[i], &s[j]);

} //交换的函数(可以套用这个模板)

}



void __cdecl sub_401619()

{

int v3; // [esp+10h] [ebp-10h]

int v4; // [esp+14h] [ebp-Ch]

int v5; // [esp+18h] [ebp-8h]

int i; // [esp+1Ch] [ebp-4h]

int a2 = 42;

v4 = 0;

v5 = 0;

for (i = 0; a2--; k[v4++] = s[(s[v5] + s[i]) % 256])

{

i = (i + 1) % 256;

v5 = (v5 + s[i]) % 256;

v3 = s[i] + 66;

s[i] = s[v5] - 33;

s[i] ^= 2u;

s[v5] = 5 * v3;

s[v5] = s[i] - 10;

s[v5] += s[i];

s[i] -= 18;

} //加密部分的函数

}

int main() {

uint8_t v2[42];

uint8_t ket[7] = {49,50,51,52,53,54};

Rc4_Init(ket, 6);

sub_401619();

v2[0] = -61;

v2[1] = -128;

v2[2] = -43;

v2[3] = -14;

v2[4] = -101;

v2[5] = 48;

v2[6] = 11;

v2[7] = -76;

v2[8] = 85;

v2[9] = -34;

v2[10] = 34;

v2[11] = -125;

v2[12] = 47;

v2[13] = -105;

v2[14] = -72;

v2[15] = 32;

v2[16] = 29;

v2[17] = 116;

v2[18] = -47;

v2[19] = 1;

v2[20] = 115;

v2[21] = 26;

v2[22] = -78;

v2[23] = -56;

v2[24] = -59;

v2[25] = 116;

v2[26] = -64;

v2[27] = 91;

v2[28] = -9;

v2[29] = 15;

v2[30] = -45;

v2[31] = 1;

v2[32] = 85;

v2[33] = -78;

v2[34] = -92;

v2[35] = -82;

v2[36] = 123;

v2[37] = -84;

v2[38] = 92;

v2[39] = 86;

v2[40] = -68;

v2[41] = 35;

for (int i = 0; i < 42; i++)

{

v2[i] = ((v2[i] - 71) ^ (k[i] & 0xff));

//return 0;

}

printf("%s",v2);

}

得到flag:

DASCTF{Welc0me-t0-j01n-SU-l0ve-suyug1eg1e}