1.查壳
无壳,为64bit 的ELF文件
2.IDA分析
拖入IDA64中,Shift+F12查看字符串
找到可用信息,双击进入后选中Ctrl+X交叉引用
OK进入后按F5查看伪代码
伪代码如下:
unsigned __int64 Decry()
{
char v1; // [rsp+Fh] [rbp-51h]
int v2; // [rsp+10h] [rbp-50h]
int v3; // [rsp+14h] [rbp-4Ch]
int i; // [rsp+18h] [rbp-48h]
int v5; // [rsp+1Ch] [rbp-44h]
char src[8]; // [rsp+20h] [rbp-40h] BYREF
__int64 v7; // [rsp+28h] [rbp-38h]
int v8; // [rsp+30h] [rbp-30h]
__int64 v9[2]; // [rsp+40h] [rbp-20h] BYREF
int v10; // [rsp+50h] [rbp-10h]
unsigned __int64 v11; // [rsp+58h] [rbp-8h]
v11 = __readfsqword(0x28u);
*(_QWORD *)src = 'SLCDN';
v7 = 0LL;
v8 = 0;
v9[0] = 'wodah';
v9[1] = '\0';
v10 = 0;
text = join(key3, (const char *)v9);
strcpy(key, key1);
strcat(key, src);
v2 = 0;
v3 = 0;
getchar();
v5 = strlen(key);
for ( i = 0; i < v5; ++i )
{
if ( key[v3 % v5] > '@' && key[v3 % v5] <= 'Z' )
key[i] = key[v3 % v5] + 32;
++v3;
}
printf("Please input your flag:");
while ( 1 )
{
v1 = getchar();
if ( v1 == '\n' )
break;
if ( v1 == ' ' )
{
++v2;
}
else
{
if ( v1 <= '`' || v1 > 'z' ) // 输入的不是小写,
{
if ( v1 > '@' && v1 <= 'Z' )
{
str2[v2] = (v1 - 39 - key[v3 % v5] + 97) % 26 + 97;
++v3;
}
}
else // 输入的是小写。
{
str2[v2] = (v1 - 39 - key[v3 % v5] + 97) % 26 + 97;
++v3;
}
if ( !(v3 % v5) )
putchar(32);
++v2;
}
}
if ( !strcmp(text, str2) )
puts("Congratulation!\n");
else
puts("Try again!\n");
return __readfsqword(0x28u) ^ v11;
}
从下往上分析,
可以推测 str2和text比较返回0时,成功。
往上看从while开始,是根据getchar的数据对str2进行处理;
再往上看,for循环是对key数组进行处理。
key是由strcpy将key1的值复制给key,再用strcat将src的值加到key后面;text则是用jion函数将key3和v9结合起来,具体双击jion函数查看:
所以:
src = ‘SLCDN’;v9[0] = ‘wodah’;
key1 = ‘ADSFK’; key3 = ‘kills’;
3.大小端序存储
这里的src和v9都涉及了大小端序的存储。什么是大小端序?
大端序存储:低字节存放在高字节,高字节存放在低字节;
小端序存储:低字节存放在低字节,高字节存放在高字节;
一般在内存中数据的存储是按照小端序的方式进行存储的。
选中v9,按H快捷键换成十六进制,可以看到v9[0] = 0x776F646168LL;
从左往右读,左边是高字节,我们可以知道, ‘w’ = 0x77 ; ‘o’ = 0x6f ….
这里要涉及一个知识点:数组的元素是按照数组元素序号从小到大排列的。
意思就是左边是低字节右边才是高字节,也就是 ‘w’=0x68,这是明显错误的,因此我们应该把v9倒着读,所以v9 = ‘hadow’;同理 src = ‘NDCLS’ 。
可以进入WinHex证实:
如果从内存中看,hadow,h就是高字节,存放到5这个高地址处。即小端序存储。
4.脚本
for循环的处理就是将key数组里的大写换成小写,因此key = ”adsfkndcls“;
flag{KLDQCUDFZO}