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-内涵软件

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Forgo7ten

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值