2022DASCTF X SU 三月春季挑战赛 easyre
链接:https://pan.baidu.com/s/1TMYsvwPn6SXt4NmE74N3Dg
提取码:tuyt
首先拿到文件,用exe去看看有没有加壳
发现这是asp的壳,我们就用
把它去壳,去壳之后放入IDA进行分析
首先shift+12去看有没有什么线索
发现这里有个right于是我们双击进去看看,然后Ctrl+x去看看它调用了些什么函数
我们一个个分析,sub_401500()这个函数里头
表示的是定义了b这个数组有256个元素
sub_40152B()这个函数
这里的sub_41A038(v1)这个函数可以知道就是v3,从最后的for循环很容易得到v3=42
所以result=42;
这里可以猜测v1是密匙,因为他是用的strcpy函数,我们就写一个脚本,看一下它这个ASCII码会转换成什么
可以发现密匙为[49,50,51,52,53,54]
然后这里最后的*(dword_492440 + i) = result,*(dword_492440 + i)先放着,继续往下看
sub_401593()函数
这里的交换,与256的循环以及前面的b[256]可以判断出来这是一个RC4的加密
sub_401619(a1, v3)函数
这是一个加密的算法,画圈部分将它简化放入for循环中当条件为a–,这里dword_492940数组就是外面的for循环中的数组,于是我们去外面看看
这里的LOBYTE(dword_492940[i]表示的是这个数组的低八位
然后这个*(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;
int v4;
int v5;
int i;
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));
}
printf("%s",v2);
}
得到flag:
DASCTF{Welc0me-t0-j01n-SU-l0ve-suyug1eg1e}
|