64位Linux下程序,直接IDA打开
主要函数为Decry,继续跟进:
继续 跟进其余函数:
join函数:
分配一块内存,先把a1复制进来,然后用strcat函数把a2也连接过来。
由于IDA中显示和实际存储的方式不一样(大端和小端),所以v9的值得反转过来,然后得到最终的text字段”killshadow”,这样一读也是有意义的字段,说明正确。
同样:得到key的值为”ADSFKNDCLS”
然后逐步往下分析程序:
还是刚接触reverse,对一些东西不太敏感,把这段代码用Python实现了下发现是把大写转为小写。
大写字母的ASCII范围为65-90,然后学过编程的都知道大小写的ASCII差32。
然后根据下文的代码逻辑爆破:
#include<stdio.h>
int main(){
char key[]="adsfkndcls";
char text[]="killshadow";
char x;
int v2=0;
int v3=10;
for(int j=0;j<10;j++){
for(int i=0;i<123;i++){
if((i>64 && i<=90) || (i>96 && i<=122)){
x=(i-key[j]+58)%26+97;
if(x==text[j])
putchar(i);
}
}
}
}
key='adsfkndcls'
text='killshadow'
k=0
flag=''
for i in range(0,10):
for j in range(0, 130):
if (j>=65 and j<=90) or (j<=122 and j>=97):
k = (j - ord(key[i]) + 58) % 26 + 97
if chr(k) == text[i]:
flag += chr(j)
print(flag)
这里的额问题是对于筛选范围时如果用数字,最后结果flag中是包含小写字母的,然而flag是去掉小写的大写组合。