惯例查壳
无壳 64位 ELF文件
用IDA64打开
找到main函数
认准Decry函数,进入
函数中的src 与 char[2]这两个变量涉及大小端的存储问题
简单了解便是二者转换为字符时,顺序是逆的
使用时需要将其反过来,才能使用
继续观察
join函数的功能:将char_1加在key3后面(如下图)
因此现在我们可以得到:
text:killshadow
key:ADSFKNDCLS
接下来一个for循环将key中的大写字母化为小写字母
后面的代码就时将是找出flag的关键
str2[v2] = (v1 - 39 - key[v3 % v5] + 97) % 26 + 97
由这段代码写出脚本(暴力求解)
#include<iostream>
using namespace std;
int main()
{
int v5=0,v3=0;
char text[]="killshadow";
char key[]="ADSFKNDCLS";
char flag[11]={0};
char table[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
v5 = strlen(key);
for (int i = 0; i < v5; ++i )
{
if ( key[v3 % v5] > '@' && key[v3 % v5] <= 'Z' )
key[i] = key[v3 % v5] + 32;
++v3;
}
int j=0;
while(j!=10)
{
for(int i=0;i<strlen(table);i++)
if(text[j] == (table[i] - 39 - key[v3 % v5] + 97) % 26 + 97)
{
flag[j++]=table[i],v3++;
break;
}
}
puts(flag);
return 0;
}
所以flag为
flag{KLDQCUDFZO}