
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=0flag=''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 + 97if chr(k) == text[i]:flag += chr(j)print(flag)
这里的额问题是对于筛选范围时如果用数字,最后结果flag中是包含小写字母的,然而flag是去掉小写的大写组合。
