首先,查个壳,64bit,那就丢进ida64中进行反编译进来之后,我们进入main函数,发现里面没什么东西,那就shift+f12搜索字符串,找到关键字符串,双击进入然后再选中该字符串,ctrl+x进入应用该字符串的函数,如下图然后,边分析,边在旁边打上注释,在阐述里面的逻辑之前,我们先了解一个小知识点,我们都知道,两个十六进制数,由1个字节构成,也就是8个01代码,通常类型为8位的,就是正向读取,而一般64位的或者更大的,都要进行逆向读取,此处的src和v9[0]就大于64位,要进行逆向读取,这段代码的主逻辑大概就是,先进行一些字符串的复制和连接,然后将key中的大写字母转换为小写字母,然后getchar读取字符(该字符的范围在a~z和A~Z之间),再根据输入的字符对某段字符串进行处理,最后比对一下,相同则正确, str2[v2] = (v1 - 39 - key[v3 % v5] + 97) % 26 + 97; 此处的str2为下方的text(已知),key也为已知,采取爆破遍历算法,得到v1,即为flag,上代码
#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
char key[] = "adsfkndcls";
char text[] = "killshadow";
for (int i = 0; i < 10; i++) //10代表的是key的长度
{
for (int j = 65; j <= 122; j++)
{
//依次遍历爆破,把控好j的取值
if (j >= 'A' && j <= 'Z' || j >= 'a' && j <= 'z')
{
if (text[i] == (j - 39 - key[i ] + 97) % 26 + 97)
{
printf("%c", j);
break;
}
}
}
}
return 0;
}
得到结果flag{KLDQCUDFZO},提交即可