re学习笔记(6)BUUCTF-re-SimpleRev

新手一枚,如有错误(不足)请指正,谢谢!!

题目链接:BUUCTF-re-SimpleRev
载入IDA_64
进入main函数查看
发现没关键代码,进入Decry()函数查看

unsigned __int64 Decry()
{
  char v1; // [rsp+Fh] [rbp-51h]
  int v2; // [rsp+10h] [rbp-50h]
  int v3; // [rsp+14h] [rbp-4Ch]
  int i; // [rsp+18h] [rbp-48h]
  int v5; // [rsp+1Ch] [rbp-44h]
  char src[8]; // [rsp+20h] [rbp-40h]
  __int64 v7; // [rsp+28h] [rbp-38h]
  int v8; // [rsp+30h] [rbp-30h]
  __int64 v9; // [rsp+40h] [rbp-20h]
  __int64 v10; // [rsp+48h] [rbp-18h]
  int v11; // [rsp+50h] [rbp-10h]
  unsigned __int64 v12; // [rsp+58h] [rbp-8h]

  v12 = __readfsqword(0x28u);
  *(_QWORD *)src = 'SLCDN';
  v7 = 0LL;
  v8 = 0;
  v9 = 'wodah';
  v10 = 0LL;
  v11 = 0;
  text = join(key3, (const char *)&v9);         // 让text等于key3+v9
                                                // key3 = "kills"
                                                // v9 = "hadow" //因为小端序存储
                                                // 
                                                // 则text = "killshadow"
  strcpy(key, key1);                            // 将key1复制给key
                                                // key = "ADSFK"
  strcat(key, src);                             // 将src处的字符串拼接到key后
                                                // key = "ADSFKNDCLS"
  v2 = 0;
  v3 = 0;
  getchar();                                    // 获取输入(清空缓冲区?)
  v5 = strlen(key);                             // v5 = key的长度 v5 = 10
  for ( i = 0; i < v5; ++i )
  {
    if ( key[v3 % v5] > 64 && key[v3 % v5] <= 90 )// if(key[v3]>64 && key[v3]<=90)
                                                // key[v3] = key[v3]+32
                                                // :将大写字母转换成小写字母
      key[i] = key[v3 % v5] + 32;               // key = "adsfkndcls"
    ++v3;
  }
  printf("Please input your flag:", src);
  while ( 1 )
  {
    v1 = getchar();
    if ( v1 == '\n' )                           // 如果输入的为换行符,则退出
      break;
    if ( v1 == ' ' )
    {
      ++v2;                                     // 如果输入的为空格,则v2加一
    }
    else
    {
      if ( v1 <= 96 || v1 > 122 )               // 如果输入的v1不为小写字母
      {
        if ( v1 > 64 && v1 <= 90 )              // 如果v1为大写字母
          str2[v2] = (v1 - 39 - key[v3++ % v5] + 97) % 26 + 97;// 对str2[v2]进行处理(v2为0每次加1)
                                                // str1[v2] = (v1-key[v3]+58)%26 + 97
                                                // 变换后str1[v2]存放小写字母
      }
      else
      {                                         // 如果输入的值v1为小写字母
        str2[v2] = (v1 - 39 - key[v3++ % v5] + 97) % 26 + 97;// 做同样处理
      }                                         // 如果不为大小写字母,则不进行处理
      if ( !(v3 % v5) )                         // 如果循环到key的最后一位
        putchar(' ');                           // 打印处一个空格
      ++v2;
    }
  }
  if ( !strcmp(text, str2) )                    // 如果text和str2存储的相同,则成功
                                                // text = "killshadow"
    puts("Congratulation!\n");
  else
    puts("Try again!\n");
  return __readfsqword(0x28u) ^ v12;
}

其中还有一个自定义的join函数

然后开始写脚本代码

#include <stdio.h>
int main(void)
{
    char text[] = "killshadow";
    char key[] = "adsfkndcls";
    int key_=strlen(key),text_ = strlen(text),i,j;
    char str2[15] = {0};
    for(i=0;i<text_;i++)
        for(j=0;;j++)
        {
            str2[i] = text[i] - 97 + 26*j + 39 -97 + key[i];
            if(str2[i]>64 && str2[i]<91)
                break;
        }
    printf("flag{%s}",str2);
    return 0;
}

其中对26取余的逆运算让我很懵,,,只好用这种笨方法了,,经过分析好像flag大小写都可?因为运算是一样的……
最后得出flag

往期回顾

小白学习笔记(0) CG-CTF-re-3 py交易
小白学习笔记(1) BUUCTF-re xor
小白学习笔记(2)BUUCTF-re-新年快乐
小白学习笔记(3) CG-CT re ReadAsm2
小白学习笔记(4)BUUCTF-re-reverse_1
小白学习笔记(5)BUUCTF-re-内涵软件

全部评论

相关推荐

已oc&nbsp;云智断更了好几天,也有一些话想说,继续更新一篇云智timeline&nbsp;4.18&nbsp;一面&nbsp;半个小时后约二面&nbsp;4.21二面&nbsp;当晚&nbsp;约hr面&nbsp;4.23hr面&nbsp;4.30&nbsp;发offer之前美团的二面挂了,进入人才库,后面又被捞起来面试,4.30号&nbsp;美团又一面,现在还没出一面结果感觉也不报什么希望,就算一面过了,还有二面,我经不起深入拷打,唉,真的,好难五一躺平了五天,吃吃玩玩睡睡~还要担心毕业,科研更是难,唉暑期可能就到此为止了,后面没有时间在这个上面了,要抓紧时间做科研,为了后面能出去实习。大厂,秋招再见!!!有一些感慨:4.1是我的第一次面试,美团,面试的时候紧张到浑身发...
daisy9542:我今晚也是美团一面,已经第六次了。我也面了其他的,没拿到 offer。但我想开了,要按照自己的节奏来,找暑期转正然后秋招大杀四方并不是唯一的出路,其实还有很多选择的,有 0 实习最后秋招拿 offer 了,也有不选择互联网去国企的外企的,考编的,创业的。现在的失败不代表以后的路都是黑暗的,只不过可能运气还没降临到头上。所以现在要做的,就是放平心态,提升自己,通过面试了解到自己的优点和不足,争取下次机会来了能好好抓住
点赞 评论 收藏
分享
03-31 17:40
已编辑
门头沟学院 算法工程师
程序员牛肉:小牛肉来也! 也不要焦虑啦,你第一志愿还没有结束,只是回到人才库(泡大池子等待各个部门挑选)而已。仅仅代表你不符合这个组的用人标准,并不能够说明你在本次暑期实习中没机会加入美团了。 还是平复好心态,不断的复盘,等待下一次面试就好了。
点赞 评论 收藏
分享
03-17 19:21
门头沟学院 Java
面试官_我太想进步了:正常企查查显示的员工一般比设计的少
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务