HZNUCTF flower

分析

32位无壳 然后放入IDA中分析

根据题目,flower大胆擦测是个花指令的题目,然后往下翻就看到了db 0E8h,一般的汇编代码不会这么单独搞出来,还有就是一大堆的dd数据,那么本题考的就是花了

image-20230328214801042

然后往下继续看

image-20230328214918941

这里句话,但是F5居然找不到

image-20230328214953641

这里我猜测是将这个程序分开了,那么我需要将他们分成两部分,一个主函数和另一个函数,这里去花就不给演示了,想要了解去花可以去看我的总结文章

去完花之后就是这样的

主函数:

image-20230328215157991

另一个函数:

image-20230328215241638

image-20230328215254878

可以从上述两个函数中能知道,这就是一个魔改的RC4加密,改的地方在交换的那里。主函数中也给出了key和Data,那么我们直接写脚本

#include<iostream>
#include<stdint.h>
#include<string.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 ^ 0x37;
}

void Rc4_Init(char* 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]);
//交换的函数(可以套用这个模板)
}
}

int sub_401619(char v11[])
{
int i=0,j=0,t=0;
int k=0;
unsigned char tmp;
for(k=0;k<22;k++)
{
i=(i+1)%256;
j=(j+s[i])%256;
tmp=s[i];
s[i]=s[j];//交换s[x]和s[y]
s[j]=tmp;
t=(s[i]+s[j])%256;
v11[k]^=s[t];//密文=明文^密匙流
}
}

int main()
{
char v10[22];
char ket[10] = "tellmewhy";
Rc4_Init(ket, strlen(ket));
v10[0] = 57;
v10[1] = 43;
v10[2] = -84;
v10[3] = -44;
v10[4] = 120;
v10[5] = -82;
v10[6] = -93;
v10[7] = 66;
v10[8] = 58;
v10[9] = 17;
v10[10] = -7;
v10[11] = 90;
v10[12] = -55;
v10[13] = -68;
v10[14] = -84;
v10[15] = 22;
v10[16] = -80;
v10[17] = -57;
v10[18] = 85;
v10[19] = -72;
v10[20] = 99;
v10[21] = 0x80;
char v11[25]={2};
for(int i = 0 ; i < 23; i++ )
{
v11[i+1]=v10[i];
}
sub_401619(v11);
for (int i = 0; i < 23; i++)
{
printf("%c",v11[i]);
}
return 0;
//flag{D1d_y0u_g3t_7h3_$l0w3rs}
}