image.png
    64位Linux下程序,直接IDA打开
    image.png
    主要函数为Decry,继续跟进:
    image.png
    image.png
    继续 跟进其余函数:
    join函数:
    image.png
    分配一块内存,先把a1复制进来,然后用strcat函数把a2也连接过来。
    由于IDA中显示和实际存储的方式不一样(大端和小端),所以v9的值得反转过来,然后得到最终的text字段”killshadow”,这样一读也是有意义的字段,说明正确。
    同样:得到key的值为”ADSFKNDCLS”
    image.png
    image.png
    image.png
    然后逐步往下分析程序:
    image.png
    还是刚接触reverse,对一些东西不太敏感,把这段代码用Python实现了下发现是把大写转为小写。
    大写字母的ASCII范围为65-90,然后学过编程的都知道大小写的ASCII差32。
    然后根据下文的代码逻辑爆破:

    1. #include<stdio.h>
    2. int main(){
    3. char key[]="adsfkndcls";
    4. char text[]="killshadow";
    5. char x;
    6. int v2=0;
    7. int v3=10;
    8. for(int j=0;j<10;j++){
    9. for(int i=0;i<123;i++){
    10. if((i>64 && i<=90) || (i>96 && i<=122)){
    11. x=(i-key[j]+58)%26+97;
    12. if(x==text[j])
    13. putchar(i);
    14. }
    15. }
    16. }
    17. }
    1. key='adsfkndcls'
    2. text='killshadow'
    3. k=0
    4. flag=''
    5. for i in range(0,10):
    6. for j in range(0, 130):
    7. if (j>=65 and j<=90) or (j<=122 and j>=97):
    8. k = (j - ord(key[i]) + 58) % 26 + 97
    9. if chr(k) == text[i]:
    10. flag += chr(j)
    11. print(flag)

    这里的额问题是对于筛选范围时如果用数字,最后结果flag中是包含小写字母的,然而flag是去掉小写的大写组合。