要点:
- 小端序存储
- 爆破脚本编写
分析:
将文件拖入exeinfope,64位无壳。
拖入ida转换伪代码发现关键函数。
跟进后,分析函数。
以上代码段分析见上图注释。
printf("Please input your flag:");
while ( 1 )
{
v1 = getchar();
if ( v1 == 10 )
break;
if ( v1 == 32 )
{
++v2;
}
else
{
if ( v1 <= 96 || v1 > 122 )
{
if ( v1 > 64 && v1 <= 90 )
{
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;
}
到这里后,要仔细耐心分析代码及其执行过程。为此我在纸上画图来表示。
所以分析得知,上段代码主要对A-Z,a-z字母进行操作:
str2[v2] = (v1 - 39 - key[v3 % v5] + 97) % 26 + 97;
知道代码逻辑后,编写爆破脚本。
text='killshadow'
key='ADSFKNDCLS'
loop='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
flag=''
s=''
v3=0
v2=0
v5=len(key)
for i in range(0,v5):
if ( key[v3 % v5] > '@' and key[v3 % v5] <= 'Z' ):
s += chr(ord(key[i])+32)
print(s)
for i in range(0,len(text)):
for j in loop:
if ord(text[i]) == (ord(j)-39-ord(s[i])+97)%26+97:
flag += j
print(flag)
运行脚本。
下面的即是flag。
flag{KLDQCUDFZO}