CTF逆向工程

简单逆向题出题与逆向

2018-03-06  本文已影响77人  Killshadow

SimpleRev

题目下载连接: https://pan.baidu.com/s/1jmWZTnqJyY2UsTTbBfD34Q 密码: kzi7

  1. 一开始现在Linux下用file命令看看是什么文件:
  1. 然后执行一下程序, 一看究竟, 发现执行不了Segmentation fault (core dumped)段错误:
  1. 用IDA打开, 从程序初始化开始, 在_init_proc中出现了sp-analysis failed的错误, 通过对比两个rsp可知, 是因为函数开头的rsp被修改了:
  1. patch之后, 能正常运行:
  1. 可以大致猜测, 这是一道分析算法的逆向题:
  1. 再回到IDA,看看特征函数:
  1. 通过下面反汇编内容,就已经可以看出key和text分别是ADSFKSLCDNkillshadow
  1. 再看看函数逻辑: 可以看到,首先是对key操作,然后是跟text比较:
  1. 写出解密算法即可解出flag:
void Encry()
{
 char key[100];
 char ch,temp;
 int L,i=0,j=0;int t;
 if(getchar()=='\n')
     temp=' ';
 printf("Input key: ");
 fgets(key,100,stdin);
 L=strlen(key);
 for(t=0;t<L;t++)
 {
     if (key[j%L] >= 'A'&&key[j%L] <= 'Z' || key[j%L] >= 'a'&&key[j%L] <= 'z')
     {
            key[t] = key[j%L] + 32;
        }
     else if(key[j%L] >= ' ' && key[j%L] <= '@')
        {
         key[t] = key[j%L] + 32;
     }
     j++;
     
 }

 while((ch=getchar())!='\n')
 {
     if(ch==' ')
     {
         i++;
         continue;
     }
     if(ch>='a'&&ch<='z')
     {
         str1[i] = (ch - 'a' + key[j%L] - 'a') % 26 + 'A';
         printf("%c",str1[i]);                                                                       
         j++;
     }
     if(ch>='A'&&ch<='Z')
     {
         str1[i] = (ch - 'a' + key[j%L] - 'a') % 26 + 'A';
         printf("%c", str1[i]);  
         j++;   
     }
     if (ch >= ' '&& ch <= '@')
     {
         str1[i] = (ch - 'a' + key[j%L] - 'a') % 26 + 'A';
         printf("%c", str1[i]);
         j++;
     }
     if(j%L==0)
         printf(" ");
     i++;
 }
 putchar(ch);
}
  1. 最后解得flag为:KLDQCUDFZO
上一篇下一篇

猜你喜欢

热点阅读