查壳
发现是64位无壳,gcc编译
ida查看伪代码
一般会自动转到main函数但习惯了通过字符串定位,可以避免对一下其它函数的忽略
可以看到在主函数中直接进行了加密算法,第一行有个_main()函数看样子是初始化一类的,这些函数有时候很头疼,不能确定参与加密没有,不过在这道题里可以确定没有参与
算法分析
- v8通过getchar函数不断从缓冲区读取字符,读到10时退出,也就是换行符,可以确定每次算法仅对一个字符进行运算
- 然后key[v9%4]异或,key担任密钥角色
- 接下来以v7为索引填充s,
他应该是一个矩阵,可以看到最后与r参与了比较 - 填充完毕后将剩余值都填充为-1
- 比较
所以多少个1就是其对应的ascll
wp
#include"stdio.h"
int main(){
int flag[]={0x35,0x2f,0x2f,0x32,0x28,0x14,0x27,0x3B,0x3D,0x70,0x3c,0x0a,0x3d,0x73,0x3a,0xa,0x1f,0x73,0x3d,0x66,0x21,0x1c,0x6d,0x28,0};
char *key ="SCNU";
for(int i=0;i<24;i++){
flag[i] ^=key[i%4];
putchar(flag[i]);
}
//sleep();
getchar();
return 0;
}
flag{Winn3r_n0t_L0s3r_#}