过程:
1.下载 得到一个无后缀文件
2.拖入IDA64 按F5 查看伪代码
3.分析代码 观察 发现是个判断 如果输入了D/d 就运行Decry() 输入Q/q就退出程序
所以现在需要看看Decry() 函数是干什么的
Ⅰ:看到16行和19行有两个16进制 按r将其转换为字符串
由于系统采用小端序而IDA采用大端 所以需要将字符串反转过来
所以 src → NDCLS ;v9 → hadow
看到22行似乎是将key3和v9连在一起然后赋给 text 查看key3是什么字符串:
所以text = "killshadow"
再顺着看下去 key = “ADSFKNDCLS”
Ⅱ:看到一个循环 按R 将数字转为字符串
大于 '@' 且小于等于 'Z' ? 加32 ? 似乎是一个大写转小写的代码
所以 key 就变为了 "adsfkndcls"
Ⅲ:继续分析
发现51行的语句是得出str2的关键 但这行代码比较难懂 所以决定用爆破算法 原封不动复制该语句来推出flag
已知text是经该语句加密后的字符串
#include <stdio.h>
int main(void)
{
char text[] = "killshadow";
char key[] = "adsfkndcls";
int v5 = 10, v3 = 10;
for (int i = 0; i < 11; i++)
{
for (int j = 0; j < 126; j++)
{
if ((j < 'A' || j > 'Z') || (j < 'z' && j > 'a')) // 排除非字母
{
continue;
}
if (((j - 39 - key[v3 % v5] + 97) % 26 + 97) == text[i])
{
printf("%c", j);
++v3;
break; // 进行加密后的字符与text对应位置的字符匹配 爆破下一个
}
}
}
return 0;
}
运行得出flag: flag{KLDQCUDFZO}
结束。