BUUCTF-Reverse:SimpleRev(算法分析题)

2023-11-05

题目地址:https://buuoj.cn/challenges#SimpleRev
在这里插入图片描述
查壳:
在这里插入图片描述
得知消息:ELF 64
直接拖进ida64分析

int __cdecl __noreturn main(int argc, const char **argv, const char **envp)
{
  int v3; // eax
  char v4; // [rsp+Fh] [rbp-1h]

  while ( 1 )
  {
    while ( 1 )
    {
      printf("Welcome to CTF game!\nPlease input d/D to start or input q/Q to quit this program: ", argv, envp);
      v4 = getchar();
      if ( v4 != 100 && v4 != 68 ) //100的ASCII码是d  68的ASCII码是D
        break;
      Decry();
    }
    if ( v4 == 113 || v4 == 81 )//113的ASCII码是q  81的ASCII码是Q
      Exit();
    puts("Input fault format!");
    v3 = getchar();
    putchar(v3);
  }
}

分析代码可知:只有输入d或D才能进入Decry()函数,否则退出,现在进入函数

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 = 357761762382LL;// SLCDN
  v7 = 0LL;
  v8 = 0;
  v9 = 512969957736LL;  //wodah
  v10 = 0LL;
  v11 = 0;
  text = (char *)join(key3, &v9);//key3=kills v9=hadow   将V9拼接到key3上,双击key3 发现是kills
  strcpy(key, key1); // key1=ADSFK
  strcat(key, src); // src=NDCLS   把src拼接到key上面
  v2 = 0;
  v3 = 0;
  getchar();
  v5 = strlen(key);
  for ( i = 0; i < v5; ++i ) //v5=10
  {
    if ( key[v3 % v5] > 64 && key[v3 % v5] <= 90 )
      key[i] = key[v3 % v5] + 32;//把大写变成小写
    ++v3;
  }//V3=10
  printf("Please input your flag:", src);
  while ( 1 )
  {
    v1 = getchar();
    if ( v1 == 10 )
      break;
    if ( v1 == 32 )
    {
      ++v2;
    }
    else
    {
      if ( v1 <= 96 || v1 > 122 )
      {
        if ( v1 > 64 && v1 <= 90 ) // 大写字母
          str2[v2] = (v1 - 39 - key[v3++ % v5] + 97) % 26 + 97;
      }
      else //小写字母
      {
        str2[v2] = (v1 - 39 - key[v3++ % v5] + 97) % 26 + 97;
      }
      if ( !(v3 % v5) )
        putchar(32);
      ++v2;
    }
  }//经过一系列变化后等于text就可以了
  if ( !strcmp(text, str2) )  // text=killshadow
    puts("Congratulation!\n");
  else
    puts("Try again!\n");
  return __readfsqword(0x28u) ^ v12;
}

strcat是用来拼接字符串的,它会将参数 src 字符串复制到参数 dest 所指的字符串尾部。
函数strcpy(字符数组1,字符串2)作用就是 将字符串2复制到字符数组1 中去
getchar()函数的作用是从计算机终端(一般为键盘)获取一个无符号字符。getchar()函数只能接收一个字符,其函数值就是从输入设备获取到的字符。
putchar的功能:是在屏幕上显示一个字符。 比如:putchar(‘a’);就是在屏幕上显示字符a
strlen() 函数从字符串的开头位置依次向后计数,直到遇见\0,然后返回计时器的值。最终统计的字符串长度不包括\0。

C语言脚本:

#include<stdio.h> 
int main()
{
	char key[] = "adsfkndcls";
	char text[] = "killshadow";
	int i;
	int v3=10;//长度 
	for (int i = 0; i < 10; i++)
	{
		for (int j = 0; j < 128; j++)
		{
			if (j < 'A' || j > 'z' || j > 'Z' && j < 'a')
			{
				continue;
			}
			if ((j - 39 - key[v3 % 10] + 97) % 26 + 97 == text[i])
			{
				printf("%c",j);
				v3++;
				break;
			}
		}
	}
}

得到flag
KLDQCUDFZO

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BUUCTF-Reverse:SimpleRev(算法分析题) 的相关文章

  • 实验七—高级数据管理(一)

    实验7 高级数据管理 一 实验目的 1 使用规范的R语言完成程序设计 2 掌握R语言自定义函数的方法 了解R语言自定义函数返回值的特殊性 3 掌握R语言多种类型的系统库函数 实验内容 1 编程实现 10以内所有偶数的和 even sum l
  • 机器学习中最小二乘和梯度下降法的个人理解

    提前说明一下 这里不涉及数学公式的推到 只是根据自己的理解来概括一下 有不准确的地方 欢迎指出 最小二乘 我们通常是根据一些离散的点来拟合出一天直线 这条直线也就是我们所说的模型 最小二乘也就是评价损失函数 loss 的一个指标 最小二乘就
  • 10.4 异常与继承

    在C 程序中 表示异常的类通常被组成为一个组 即如在前面各节讨论的那样 或者一个层次结构 1 例如 定义一个称为Excp的基类 由它来打印错误信息 class Excp public void print string msg cerr l
  • my学习OC--类的构造函数和析构函数

    前言 OC中定义和初始化对象一般使用alloc 不用new 原因 new和alloc init在功能上几乎是一致的 分配内存并完成初始化 差别在于 采用new的方式只能采用默认的init方法完成初始化 1 init继承于NSObject这个
  • uniapp 模块权限配置 权限管理 权限设置

    在uni app中如何配置权限 首先 我们先通过API了解 他对权限的需求 比如在上个帖子中 gt gt 对APP后台静默更新升级对文件管理和文件下载权限的需求 当时我们使用了这个权限 android permission WRITE EX
  • Vue刷题记录

    文章目录 前言 一 Vue的特点 二 Vue自定义指令钩子函数 三 Vue模块化开发 四 Vuex的属性 五 Vue中的scoped 什么是scoped scoped实现原理 scoped穿透 1 使用曲线救国的一个方法 用两个 style
  • Java 【手写webserver】学习笔记

    手写WebServer 基础知识 灵魂反射 import java lang reflect InvocationTargetException 反射 将JAVA类中的各种结构 方法 属性 构造器 类名 映射成一个个Java对象 1 获取c
  • vue使用elment的弹窗里面调用AMap.Autocomplete数据列表不显示问题

    amap sug result z index 10240 important 或者是地图异步问题
  • Windows共享内存解析

    在Windows程序开发过程中 当多个进程之间需要使用同样的数据的时候我们最好的方式就是通过共享内存进行处理 比如 当A进程运行时 进行数据处理 那么此时我想知道数据是不是正确 用B监控 那么A与B之间就可以使用共享内存的方式 并且这时来个
  • vue使用百度地图的循环显示标注图标--标注点的移入移出点击事件--修改标注点

    百度地图 import bmapJSON from assets js custom map config json import Micon from assets icon marker2 png import MiconHover f
  • 输入网址到页面显示经历的过程

    在浏览器里输入网址 比如输入www baidu com 到页面显示经历的过程如下 1 域名解析 根据输入的网址 去寻找对应的IP地址 DNS域名解析过程如下 浏览器的缓存 会先从浏览器的缓存中查找IP 浏览器会缓存DNS一段时间 系统缓存
  • RuoYi若依管理系统最新版 基于SpringBoot的权限管理系统

    RuoYi是一个后台管理系统 基于经典技术组合 Spring Boot Apache Shiro MyBatis Thymeleaf 主要目的让开发者注重专注业务 降低技术难度 从而节省人力成本 缩短项目周期 提高软件安全质量 本地版本为截
  • EXCEL词典(xllex.dll)文件丢失或损坏解决方法

    EXCEL词典 xllex dll 文件丢失或损坏解决方法 1 问题 2 解决 fail 3 方法2 regsvr32 xllex dll 4 方法3 启动server 5 方法4 Windows Registry Editor Vers
  • MS COCO数据集输出数据的结果格式(result format)和如何参加比赛(participate)(来自官网)

    COCO系列文章 MS COCO数据集目标检测评估 Detection Evaluation 来自官网 MS COCO数据集人体关键点评估 Keypoint Evaluation 来自官网 MS COCO数据集输出数据的结果格式 resul
  • Scala中的range

    1 定义 range 是一种数据结构 一种容器 是一种特殊的 带索引的 不可变的 等差数字序列 2 声明 eg val range1 new Range 1 5 2 range1 foreach println 输出 ps println
  • transformer详解(自用)

    Transformer 非常棒的解释 微信公众号解释也不错 Transformer带来的其他优点 并行计算 提高训练速度 Transformer用attention代替了原本的RNN 而RNN在训练的时候 当前step的计算要依赖于上一个s
  • 静态编译 与 动态编译

    C的编译过程 1 什么是静态 动态编译 静态编译 编译器在编译可执行文件时 把需要用到的对应动态链接库 so 或 lib 中的部分提取出来 连接到可执行文件中 2 为什么要使用静态 动态编译 不想让人看见内部接口的实现细节 只想给一个接口名
  • linux内存管理——内存大小、起始地址的解析与修改

    1 前言 1 本文是以hi3516dv300芯片的uboot和内核源码进行讲解 uboot版本是2016 11 内核版本是4 9 37 2 uboot没有采用设备树技术 还是传统的tag传参 内核采用了设备树技术 镜像是zImage dtb

随机推荐