SimpleRev WriteUp

Posted hardcoreyutian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SimpleRev WriteUp相关的知识,希望对你有一定的参考价值。

题目地址

https://buuoj.cn/challenges#SimpleRev

题解

IDA64打开,F5反编译,双击进入Decry函数。一开始我困在如何将一个int64转换为字符串,百度了许多博客,关于itoa64函数啥的一堆(用VS),都不得行,最后在IDA64里试了试右键,发现点Char就能转为字符串,我…

技术图片

从网上得知,x86是小端

技术图片

(不知道我这种判断大端小端的方法是否正确,欢迎大佬指正!)

那么两个字符串需要倒着读

技术图片

然后继续分析,可以转为C语言运行方便分析

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 int main()
  4 {
  5     char v1;
  6     int v2,v3;
  7     char src[8];
  8     char str2[30];
  9     char key[30]="adsfkndcls";
 10     char text[30]="killshadow";
 11     int v5 = strlen(key);
 12     v3=0;
 13     v2=0;
 14     printf("Please input your flag:", src);
 15       while ( 1 )
 16       {
 17         v1 = getchar();
 18         if ( v1 == 10 ) // ‘
‘ 
 19               break;
 20         if ( v1 == 32 ) // ‘ ‘
 21         {
 22               ++v2;
 23         }
 24         else
 25         {
 26               if ( v1 <= 96 || v1 > 122 ) // v1不是小写字母 
 27               {
 28                 if ( v1 > 64 && v1 <= 90 ) // v1是大写字母 
 29                       str2[v2] = (v1 - 39 - key[v3++ % v5] + 97) % 26 + 97;
 30               }
 31               else // v1是小写字母 
 32               {
 33                 str2[v2] = (v1 - 39 - key[v3++ % v5] + 97) % 26 + 97;
 34               }
 35               if ( !(v3 % v5) )
 36                 putchar(32);
 37           ++v2;
 38         }
 39       }
 40       if ( !strcmp(text, str2) )
 41         puts("Congratulation!
");
 42       else
 43         puts("Try again!
");
 44     return 0;
 45 }

我们能看出,输入flag,flag经过函数转化后得到的str2等于text,即”killshadow”时flag正确。很奇怪的是,当我设定输入的flag均为小写字母时,得到flag:efxkwoxzti,是错误的,flag为均大写字母时,得到flag:KLDQCUDFZO是正确的。

我的爆破脚本:

  1 #include<bits/stdc++.h>
  2 int main()
  3 {
  4     int v2=0;
  5     int v3=0;
  6     int v5;
  7     int tv3;
  8     int i=0;
  9     char tmp;
 10     char text[20]="killshadow";
 11     char key[20]="adsfkndcls";
 12     v5=strlen(key);
 13     char test[20];
 14     char ans;
 15     char trans;
 16     char x;
 17     while(i<=9){
 18         tv3=v3;
 19         tmp=text[i];
 20         //ans=97;
 21         ans=65;
 22         trans=(ans-39-key[tv3++ % v5]+97)%26+97;
 23         while(trans!=tmp){
 24             ans=ans+1;
 25             tv3=v3;
 26             trans=(ans-39-key[tv3++ % v5]+97)%26+97;
 27         }
 28         printf("%c",ans);
 29         v3++;
 30         i++;
 31     }
 32     return 0;
 33 }

以上是关于SimpleRev WriteUp的主要内容,如果未能解决你的问题,请参考以下文章

BUUCTF--SimpleRev

buuctf-SimpleRev

buuctf-SimpleRev

[Java代码审计]javacon WriteUp

Natas32 Writeup(Perl 远程代码执行)

2021.12掌控安全擂台赛 部分WriteUp