HZNUCTF flower
分析
32位无壳 然后放入IDA中分析
根据题目,flower大胆擦测是个花指令的题目,然后往下翻就看到了db 0E8h,一般的汇编代码不会这么单独搞出来,还有就是一大堆的dd数据,那么本题考的就是花了
然后往下继续看
这里句话,但是F5居然找不到
这里我猜测是将这个程序分开了,那么我需要将他们分成两部分,一个主函数和另一个函数,这里去花就不给演示了,想要了解去花可以去看我的总结文章
去完花之后就是这样的
主函数:
另一个函数:
可以从上述两个函数中能知道,这就是一个魔改的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[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; }
|