BUUCTF SimpleRev

分析

该文件为64位的ELF文件,运行在linux平台
使用IDA64打开
在这里插入图片描述
进入Decry函数
在这里插入图片描述
输入flag和成功的提示
看看如何才能成功拿到flag
在这里插入图片描述

这里比较text和str2,text是源代码就有的
在这里插入图片描述

那么str2应该就是我们输入的内容
先分析text的内容是什么
进入join函数
该函数将两个输入字符串连接在一起,并返回一个新的字符串,表示连接后的结果。

char *__fastcall join(const char *a1, const char *a2)
{size_t v2; // 用于存储第一个输入字符串的长度size_t v3; // 用于存储第二个输入字符串的长度char *dest; // 用于存储连接后的字符串的指针// 计算第一个输入字符串的长度v2 = strlen(a1);// 计算第二个输入字符串的长度v3 = strlen(a2);// 分配足够的内存来存储连接后的字符串,加1是为了存储字符串结尾的空字符 '\0'dest = (char *)malloc(v2 + v3 + 1);// 检查内存分配是否成功if (!dest)exit(1); // 如果分配失败,则退出程序// 将第一个输入字符串复制到目标字符串strcpy(dest, a1);// 将第二个输入字符串连接到目标字符串末尾strcat(dest, a2);// 返回连接后的字符串return dest;
}

我们不难得到text的值
在这里插入图片描述
点击一下0x776F646168LL然后按r
因为是小端序,所以低位在前,高位在后,所以最后需要反过来

hadow

在这里插入图片描述在这里插入图片描述

killshadow

接下来就看要如何输入才能构造出这个字符串
将所有字符显示出来,点击在数字上然后按r,这样看着更直观
在这里插入图片描述

这里贴上ascii码表链接作为对照: https://tool.oschina.net/commons?type=4

在这里插入图片描述
如果你输入的是大写字母,那么就执行下面的语句

str2[v2] = (v1 - 39 - key[v3 % v5] + 'a') % 26 + 'a';
++v3;

如果是小写就执行

str2[v2] = (v1 - 39 - key[v3 % v5] + 'a') % 26 + 'a';
++v3;

输入其他的字符就不进行处理

你会发现这两条语句是一样的,也就是说只要输入的是英文,就执行这条语句,后面 %26说明最后运算出来的结果都不会大于26,最后加上a,也就是说最后计算出来的范围是小写字母

这里我们还需要知道key是什么
在这里插入图片描述
这里将key1的值给了key,然后在key的末尾追加了src (这里的SLCDN同样要反过来,图上写错了)
最后下面的for循环将key中所有的字母都小写了
所以最后key的值为 adsfkndcls
v3的值为10
v5的值为10

EXP

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char const *argv[])
{int v3 = 10, v5 = 10, l, a;char key[] = "adsfkndcls";char str2[20];int  base = 65;		// 以大写为基数// str2[v2] = (v1 - 39 - key[v3 % v5] + 'a') % 26 + 'a';// str2[v2] = (v1  - key[v3 % v5] + 58) % 26 + 'a';// str2[v2] = (23  - key[v3 % v5] + 58) % 26 + 'a';char text[] = "killshadow";for (int i = 0; i < strlen(text); i++){l = (base + 58  - key[v3 % v5]) % 26;     // 这里之所以多了个65是因为字母的最小ASCII码就是65a = text[i] - 'a';// 有两种情况,大于 answer 和小于 answerif (l > a)printf("%c", base + 26 - l + a);elseprintf("%c", base + a - l);v3++;}
}

最终flag

flag{KLDQCUDFZO}

其实还有个答案,就是以小写为基数,将base改为97

flag{efxkwoxzti}

但是flag就只有一个,那就是那个大写的falg

其他解法

还有一种解法就是直接进行暴力破解
因为我们的输入也就是英文字母

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char const *argv[])
{int v3 = 10, v5 = 10, l, a;char text[] = "killshadow";char key[] = "adsfkndcls";char str2[20];int base = 65;for (int n = 0; n < strlen(text); n++){for (int i = base; i < 26 + base; i++){// str2[v2] = (v1 - 39 - key[v3 % v5] + 'a') % 26 + 'a';if ((i - 39 - key[v3 % v5] + 'a') % 26 + 'a' == text[n]){printf("%c", i);v3++;break;}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/100410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot项目整合MybatisPlus持久层框架+Druid数据库连接池

前言 之前搭建SpringBoot项目工程&#xff0c;所使用的持久层框架不是Mybatis就是JPA&#xff0c;还没试过整合MybatisPlus框架并使用&#xff0c;原来也如此简单。在此简单记录一下在SpringBoot项目中&#xff0c;整合MybatisPlus持久层框架、Druid数据库连接池的过程。 一、…

Eclipse iceoryx(千字自传)

1 在固定时间内实现无任何限制的数据传输 在汽车automotive、机器人robotics和游戏gaming等领域,必须在系统的不同部分之间传输大量数据。使用Linux等操作系统时,必须使用进程间通信(IPC)机制传输数据。Eclipse iceoryx是一种中间件,它使用零拷贝Zero-Copy、共享内存Share…

【OSPF宣告——network命令与多区域配置实验案例】

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大二在校生&#xff0c;喜欢编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;小新爱学习. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc…

win10电脑插入耳机,右边耳机声音比左边小很多

最近使用笔记本看视频&#xff0c;发现插入耳机&#xff08;插入式和头戴式&#xff09;后&#xff0c;右边耳机声音比左边耳机声音小很多很多&#xff0c;几乎是一边很清晰&#xff0c;另一边什么都听不到。 将耳机插到别人电脑上测试耳机正常&#xff0c;那就是电脑的问题。试…

自然语言处理(NLP)的开发框架

自然语言处理&#xff08;NLP&#xff09;领域有许多开源的框架和库&#xff0c;用于处理文本数据和构建NLP应用程序。以下是一些常见的NLP开源框架及其特点&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合…

Outlook屏蔽Jira AI提醒

前言&#xff1a;最近不知道为什么jira上的ai小助手抽风&#xff0c;一周发个几千封邮件…导致我现在都不想在邮箱里面跟找垃圾一样找消息了。实在忍无可忍&#xff0c;决定屏蔽AI小助手&#xff0c;方法很简单&#xff0c;follow me~~ 第一步&#xff1a;双击打开电脑版Outloo…

springboot家乡特色推荐系统springboot28

大家好✌&#xff01;我是CZ淡陌。一名专注以理论为基础实战为主的技术博主&#xff0c;将再这里为大家分享优质的实战项目&#xff0c;本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路…

leetCode 1143.最长公共子序列 动态规划 + 滚动数组

1143. 最长公共子序列 - 力扣&#xff08;LeetCode&#xff09; 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串…

Oracle Database Express Edition (XE)配置与部署

获取下载安装包 https://www.oracle.com/cn/database/technologies/xe-downloads.htmlhttps://yum.oracle.com/repo/OracleLinux/OL7/latest/x86_64/index.html安装.rpm安装包 cd /usr/local/src wget https://download.oracle.com/otn-pub/otn_software/db-express/oracle-d…

Linux下kibana的安装与配置

1. 环境配置 确保Linux服务器上已安装Java 8或更高版本。可以通过运行 java -version 来验证Java的版本。 下载Kibana 7.17.11的压缩文件&#xff0c;可以从Kibana 7.17.11下载 上传服务器&#xff0c;并解压Kibana压缩文件。 2. Kibana配置 编辑Kibana的配置文件 config/k…

Idea下面git的使用:变基、合并、优选、还原提交、重置、回滚、补丁

多分支和分支切换 变基和合并 变基是把本项目的所有提交都列出来按顺序一个个提交到目标分支上去 而合并是把两个分支合并起来&#xff0c;但是旧的分支还是可以启动其他分支&#xff0c;在旧的分支上继续开发 master: A -- B -- C -- M/ feature: D -- Emaster: A -…

粘性文本整页滚动效果

效果展示 CSS 知识点 background 相关属性综合运用position 属性的 sticky 值运用scroll-behavior 属性运用scroll-snap-type 属性运用scroll-snap-align 属性运用 整体页面效果实现 <div class"container"><!-- 第一屏 --><div class"sec&qu…

JAVA编程题-求矩阵螺旋值

螺旋类 package entity; /*** 打印数组螺旋值类*/ public class Spiral { // 数组行private int row; // 数组列private int col; // 行列数private int size; // 当前行索引private int rowIndex; // 当前列索引private int colIndex; // 行开始索引private int rowStart; //…

Docker---cgroups资源限制

目录 一、cpu资源控制 1、 设置cpu使用率上限 2、设置cpu资源占用比&#xff08;设置多个容器时才有效&#xff09; 3、设置容器绑定指定的CPU 三、内存资源控制 四、磁盘IO配额控制 1、限制Block IO 2、限制bps和iops进行限制 一、cpu资源控制 cgroups是一个非常强大的…

web基础以及http协议

web基础&#xff0c;http协议 域名&#xff1a;www.88886.co DNS解析 静态页面 动态页面 DNS域名&#xff1a; 网络上的通信都是基于IP通信模式&#xff1a;TCP/IP TCP建立连接和断开连接&#xff0c;都是要双方进行确认的 建立连接&#xff1a;三次握手 断开连接&#x…

Spring源码解析(十二):TransactionInterceptor事务拦截器

Spring源码系列文章 Spring源码解析(一)&#xff1a;环境搭建 Spring源码解析(二)&#xff1a;bean容器的创建、默认后置处理器、扫描包路径bean Spring源码解析(三)&#xff1a;bean容器的刷新 Spring源码解析(四)&#xff1a;单例bean的创建流程 Spring源码解析(五)&…

dockerfile lnmp 搭建wordpress、docker-compose搭建wordpress

-----------------安装 Docker--------------------------- 目前 Docker 只能支持 64 位系统。systemctl stop firewalld.service setenforce 0#安装依赖包 yum install -y yum-utils device-mapper-persistent-data lvm2 --------------------------------------------------…

NoSQL之Redis 主从复制配置详解及哨兵模式

目录 1 Redis 主从复制 1.1 主从复制的作用 1.2 主从复制流程 2 搭建Redis 主从复制 2.1 安装 Redis 2.2 修改 Redis 配置文件&#xff08;Master节点操作&#xff09; 2.3 修改 Redis 配置文件&#xff08;Slave节点操作&#xff09; 2.4 验证主从效果 3 Redis 哨兵模…

揭秘 Go 中的 new() 和 make() 函数

Go&#xff08;或 Golang&#xff09;是一种现代、静态类型、编译型的编程语言&#xff0c;专为构建可扩展、并发和高效的软件而设计。它提供了各种内置的函数和特性&#xff0c;帮助开发人员编写简洁高效的代码。其中包括 new() 和 make() 函数&#xff0c;这两个函数乍看起来…

一个命令让redis服务端所有信息无所遁形~(收藏吃灰系列)

Redis服务器是一个事件驱动程序&#xff0c;它主要处理两类事件&#xff1a;文件事件和时间事件。这些事件的处理和Redis命令的执行密切相关。下面我将以Redis服务端命令为切入点&#xff0c;深入解析其工作原理和重要性。 首先&#xff0c;我们先了解Redis服务端有哪些命令。…