BUUCTF逆向刷题笔记(1-12)
easyre、内涵的软件、xor、不一样的flag:
buuctf reverse部分题解(实时更新)_reverse 题解-CSDN博客
请见小库里的blog。
reverse1
查壳发现没有,而且是64位

粗略改一下部分函数名,看看主要逻辑。

第一个for循环暂时不知道干什么的,但是一眼就看到最后几行的strcmp。 看来就是str1和str2的比较,str1是我们自己输入的,那么主要就是分析str2。第二个for循环明显是把o变成0(需要按r转换一下字符)。双击str2就知道str2的内容。
reverse2
查出来是64位。可以放虚拟机运行一下看看,进去就是直接输入flag。

我们拖进IDA看看。

一样的字符替换逻辑。SHIFT+F12就可以看到原始的flag。 替换即可。
新年快乐
光看代码什么也看不出,看看能不能通过动调拿到信息。

题目上说就是一个字符串! 在看了一下发现有壳,忘记脱壳了!!!脱完壳直接就看出来答案了,服了。
reverse3
查壳,是32位。

看一下关键代码。看样子是输入了一个字符串,经过sub_4110BE函数处理之后,又获得了一个Destination字符串,并且来比较。那么我们看看这个函数的逻辑是什么。点进去发现一个全局变量,有如下编码表。怀疑是base64编码。


注意有个for循环,估计是将这个Destination字符串前11位每一位都加了1,我们只需要搞个脚本给他返回去即可。Str2就是我们需要比较的字符串,其实我们已经有这个字符串的值,所以写脚本也是比较好写的。然后base解码即可。
import base64
a='e3nifIH9b_C@n@dH'
c=''
for i in range(0,len(a)):c+=(chr(ord(a[i])-i))
print('base64:'+c)
c=bytes(c,encoding='utf-8')
mydecode=base64.b64decode(c)
print('flag'+str(mydecode,encoding='utf-8'))
上述代码运行结果:

helloword

这是一个apk文件,进去啥玩意都没有。所以猜测藏在了安装包里了flag。

还算简单,mainActivity里面就是flag。
SimpleRev (未完成)
这是一个64位ELF文件。下面是关键代码。
unsigned __int64 Decry()
{char input; // [rsp+Fh] [rbp-51h]int v2; // [rsp+10h] [rbp-50h]int v3; // [rsp+14h] [rbp-4Ch]int i; // [rsp+18h] [rbp-48h]int keylen; // [rsp+1Ch] [rbp-44h]char src[8]; // [rsp+20h] [rbp-40h] BYREF__int64 v7; // [rsp+28h] [rbp-38h]int v8; // [rsp+30h] [rbp-30h]__int64 v9[2]; // [rsp+40h] [rbp-20h] BYREFint v10; // [rsp+50h] [rbp-10h]unsigned __int64 v11; // [rsp+58h] [rbp-8h]v11 = __readfsqword(0x28u);*(_QWORD *)src = 0x534C43444ELL;v7 = 0LL;v8 = 0;v9[0] = 0x776F646168LL;v9[1] = 0LL;v10 = 0;text = join(key3, (const char *)v9); // kills--key3strcpy(key, key1); // adsfk key1strcat(key, src);v2 = 0;v3 = 0;getchar();keylen = strlen(key);for ( i = 0; i < keylen; ++i ){if ( key[v3 % keylen] > '@' && key[v3 % keylen] <= 'Z' )key[i] = key[v3 % keylen] + 32;++v3;}printf("Please input your flag:");while ( 1 ){input = getchar();if ( input == '\n' )break;if ( input == 32 ){++v2;}else{if ( input <= '`' || input > 'z' ){if ( input > '@' && input <= 'Z' ){str2[v2] = (input - 39 - key[v3 % keylen] + 97) % 26 + 97;++v3;}}else{str2[v2] = (input - 39 - key[v3 % keylen] + 97) % 26 + 97;++v3;}if ( !(v3 % keylen) )putchar(32);++v2;}}if ( !strcmp(text, str2) )puts("Congratulation!\n");elseputs("Try again!\n");return __readfsqword(0x28u) ^ v11;
}
这就是一个自己写的算法,接下来进行仔细分析。
首先,在末尾可以看出比较的是text,所以我们先给text求出来。程序自定义了一个join函数,实际上就是拼接俩字符串。这也是个小端序文件要注意。此外,v9应该理解为字符串,因为其最后一个是0,相当于0x0。编写脚本求出text先。

看程序代码,str2明显是需要求出来。str2会和key相等。根据算法来看,我们应该先求出key,再考虑具体的算法。所以接下来计算key。

程序这段代码实现了对key的进一步操作,就是转为小写。(注意ASCII码+32)v3只是一个计数器罢了

接下来就可以看看是如何利用key来生成str2的。

待更新
[GXYCTF2019]luck_guy
直接进入关键函数看看。
unsigned __int64 get_flag()
{unsigned int v0; // eaxint i; // [rsp+4h] [rbp-3Ch]int j; // [rsp+8h] [rbp-38h]__int64 s; // [rsp+10h] [rbp-30h] BYREFchar v5; // [rsp+18h] [rbp-28h]unsigned __int64 v6; // [rsp+38h] [rbp-8h]v6 = __readfsqword(0x28u);v0 = time(0LL);srand(v0);for ( i = 0; i <= 4; ++i ){switch ( rand() % 200 ){case 1:puts("OK, it's flag:");memset(&s, 0, 0x28uLL);strcat((char *)&s, f1);strcat((char *)&s, &f2);printf("%s", (const char *)&s);break;case 2:printf("Solar not like you");break;case 3:printf("Solar want a girlfriend");break;case 4:s = 0x7F666F6067756369LL;v5 = 0;strcat(&f2, (const char *)&s);break;case 5:for ( j = 0; j <= 7; ++j ){if ( j % 2 == 1 )*(&f2 + j) -= 2;else--*(&f2 + j);}break;default:puts("emmm,you can't find flag 23333");break;}}return __readfsqword(0x28u) ^ v6;
}
首先题目是一个随机数生成,我们肯定不可能赌运气一遍遍地运行的。分析一下switch函数的几个子项,case 1直接显示出来了flag。首先f1已经知道了,主要就是看f2怎么来搞得。主要看情况4和情况5.他们应该控制着f2。

首先要注意,checksec检查出来是小端序,所以s这个应该是小端序储存,也就是阅读习惯与咱们是相反的。然后f2被赋值为s。5应该是在4之后对f2进行操作。我们可以根据这个算法写出python脚本。得到结果和F1拼接即可。
s = [0x69, 0x63, 0x75, 0x67, 0x60, 0x6F, 0x66, 0x7F]
# 手动转换一下,因为本身是小端序储存,转到python顺序需要更改。
result = []
for i, value in enumerate(s):if i % 2 == 1:result.append(chr(value - 2))else:result.append(chr(value - 1))# 打印结果
result_str = ''.join(result)
print(result_str)
Java逆向解密
反编译class看看:

分析一下,最下面是一个if验证输入的内容是否和KEYlist相等。main 方法应该就是一个输入了。我们主要看Encrypt。看到主要算法估计是c加上个@的ascii码再异或32.这样的话思路就很清晰了。
a=[180, 136, 137, 147, 191, 137, 147, 191, 148, 136, 133, 191, 134, 140, 129, 135, 191, 65]
b=''
for i in a:b+=chr((i^32)-ord('@'))#i^32需要加括号 因为运算优先级的问题
print(b)
相关文章:
BUUCTF逆向刷题笔记(1-12)
easyre、内涵的软件、xor、不一样的flag: buuctf reverse部分题解(实时更新)_reverse 题解-CSDN博客 请见小库里的blog。 reverse1 查壳发现没有,而且是64位 粗略改一下部分函数名,看看主要逻辑。 第一个for循环暂…...
如何改变怂怂懦弱的气质(2)
你是否曾经因为害怕失败而逃避选择?是否因为不敢拒绝别人而让自己陷入困境?是否因为过于友善而被人轻视?如果你也曾为这些问题困扰,那么今天的博客就是为你准备的。我们将从行动、拒绝、自我认知、实力提升等多个角度,…...
【DeepSeek】5分钟快速实现本地化部署教程
一、快捷部署 (1)下载ds大模型安装助手,下载后直接点击快速安装即可。 https://file-cdn-deepseek.fanqiesoft.cn/deepseek/deepseek_28348_st.exe (2)打开软件,点击立即激活 (3)选…...
算法之二维装水问题
目录 1. 题目2. 解释3. 思路4. 代码5. 总结 1. 题目 给定一个数组arr,已知其中所有的值都是非负的,将这个数组看作一个容器,请返回容器能装多少水 比如,arr {3,1,2,5,2,…...
[C语言日寄] 字符串操作函数的使用及其拓展
【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还是…...
用Python的Pandas库解锁数据科学:从入门到实战
用Python的Pandas库解锁数据科学:从入门到实战 引言 Python的Pandas库(名称源自"Panel Data")作为数据科学生态系统的基石,凭借其强大的数据结构和灵活的操作功能,已成为全球超过90%数据工作者的首选工具。…...
利率债、信用债、可转债区别与优势
利率债、信用债、城投债和可转债是债券市场的主要品种,它们在发行主体、风险收益特征和投资优势上各有不同。以下是它们的区别和优势: 1. 利率债 定义:利率债是由政府或政府支持的机构发行的债券,主要包括国债、政策性金融债&…...
12、Vue 生命周期各阶段及任务
Vue 2 生命周期各阶段及任务 创建阶段 beforeCreate 此时实例刚刚初始化,数据观测(data)和 event/watcher 事件配置还未开始。通常在此阶段无法访问 data 中的数据和 methods 中的方法。可以进行一些与 Vue 实例无关的全局初始化操作&#x…...
AI进化太快,建立完善的AI理论迫在眉睫
如今的AI用日新月异来形容都毫不夸张。DeepSeek的热度还没降,Manus 又火了。随着AI越来越强大且进化速度越来越快,建立完善的AI理论迫在眉睫。 虽然AI是人类创造的,但是我们其实没有完全理解其原理。深度学习本质上还是一个黑盒,…...
MATLAB程序介绍,三维环境下的IMM(交互式多模型),使用CV和CT模型,EKF作为滤波
本文所述的MATLAB代码为三维的交互式多模型(IMM)滤波器,结合了匀速直线运动(CV模型)和匀速圆周运动(CT模型)的状态估计。使用扩展卡尔曼滤波(EKF)来处理状态更新与观测数…...
[Windows] 多系统键鼠共享工具 轻松跨系统控制多台电脑
参考原文:[Windows] 多系统键鼠共享工具 轻松跨系统控制多台电脑 还在为多台电脑需要多套键盘鼠标而烦恼吗?是不是在操控 Windows、macOS、Linux 不同系统电脑时手忙脚乱?现在,这些问题通通能解决!Deskflow 软件闪亮登…...
【leetcode hot 100 48】旋转图像
方法一:(原地旋转)对于矩阵中第 i 行的第 j 个元素,在旋转后,它出现在倒数第 i 列的第 j 个位置。matrix[row][col]在旋转后的新位置为matrix[col][n−row−1]。只要旋转四次就能回到原点。 class Solution {public vo…...
K8S高可用集群-小白学习之二进制部署(ansible+shell)
一.K8S高可用集群配置概述 序言:本文从一个小白的视角进行K8S的研究和部署,采用二进制的方式是为了更清楚了分解部署流程及了解这个集群是怎么运作的,加上ansible+shell是方便在这个过程中,遇到了问题,我们可以不断的快速重复部署来测试和研究问题的所在点,本文的架构图…...
【哇! C++】类和对象(三) - 构造函数和析构函数
目录 一、构造函数 1.1 构造函数的引入 1.2 构造函数的定义和语法 1.2.1 无参构造函数: 1.2.2 带参构造函数 1.3 构造函数的特性 1.4 默认构造函数 二、析构函数 2.1 析构函数的概念 2.2 特性 如果一个类中什么成员都没有,简称为空类。 空类中…...
利用Ollama+AnythingLLM+本地向量数据库Milvus+本地DeepSeek大模型实现知识库的搭建
1. Ollama的搭建 基本介绍 Ollama是一个支持在Windows、Linux和MacOS上本地运行大语言模型的工具。它允许用户非常方便地运行和使用各种大语言模型,比如Qwen模型等。用户只需一行命令就可以启动模型。 Ollama 下载:https://ollama.com/download Ollama 官方主页&a…...
攻防世界WEB(新手模式)19-file_include
先进行代码分析 include("./check.php");:包含并执行当前目录下的check.php文件,通常用于引入一些通用的函数、类或配置信息。if(isset($_GET[filename])):检查是否通过 GET 请求传递了名为filename的参数。如果传递了filename参数…...
Facebook 的隐私保护数据存储方案研究
Facebook 的隐私保护数据存储方案研究 在这个信息爆炸的时代,数据隐私保护已成为公众关注的热点。Facebook,作为全球最大的社交媒体平台之一,承载着海量用户数据,其隐私保护措施和数据存储方案对于维护用户隐私至关重要。本文将深…...
app UI自动化测试框架都包含哪些内容?
UI自动化测试框架是指用于自动化执行用户界面(UI)相关测试的工具和库。它们可以帮助开发团队提高测试效率、发现和解决应用程序中的问题,并确保应用程序的正确性和稳定性。下面将详细介绍一个完整的UI自动化测试框架应该具备的内容。 1. 测试环境配置 UI自动化测试框…...
C++ 中 `shared_ptr` 的用法及常见陷阱解析
shared_ptr 是 C 标准库(<memory> 头文件)中提供的一种智能指针,用于管理动态分配的内存。它通过引用计数(reference counting)来实现多个 shared_ptr 对象共享同一块内存的所有权。当最后一个 shared_ptr 被销毁…...
Android+SpringBoot的老年人健康饮食小程序平台
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,我会一一回复,希望帮助更多的人。 系统介绍 我将从经济、生活节奏、技术融合等方面入手,详细阐述居家养老管理模式兴起的…...
ORB-SLAM2源码学习(六):相机跟踪(局部地图跟踪和关键帧创建)
目录 1.局部地图跟踪 1.1 更新局部关键帧UpdateLocalKeyFrames 1.2 更新局部地图点(来自局部关键帧)UpdateLocalPoints() 1.3 投影匹配 2. 对比四种跟踪方式以及使用的投影匹配 3.关键帧创建 3.1 判断是否需要创建新关键帧: NeedNewKeyFrame() 3…...
视频格式有哪些视频格式汇总
视频格式是指视频文件的编码和封装方式,不同的格式适用于不同的应用场景。以下是一些常见的视频格式及其特点: 1. MP4(MPEG-4 Part 14) 特点:最流行的视频格式之一,支持多种视频编码标准(如H.…...
【极客时间】浏览器工作原理与实践-2 宏观视角下的浏览器 (6讲) - 2.6 渲染流程(下):HTML、CSS和JavaScript,是如何变成页面的?
https://time.geekbang.org/column/article/118826 2.6 渲染流程(下):HTML、CSS和JavaScript,是如何变成页面的? 2.5介绍了渲染流水线中的 DOM 生成、样式计算和布局三个阶段,2.6讲解渲染流水线后面的阶段…...
浏览器WEB播放RTSP
注意:浏览器不能直接播放RTSP,必须转换后才能播放。这一点所有的播放都是如此。 参考 https://github.com/kyriesent/node-rtsp-stream GitHub - phoboslab/jsmpeg: MPEG1 Video Decoder in JavaScript 相关文件方便下载 https://download.csdn.net…...
DeepSeek开源Day4:DualPipeEPLB技术详解
2 月 24 日,DeepSeek 启动 “开源周”,第四个开源的代码库为 DualPipe 与 EPLB(一下发布了两个)。DualPipe 与 EPLB 依然使用了大量与 Hopper 架构绑定的技术。 DualPipe 是由 DeepSeek-AI 团队开发的一种双向流水线并行通信算法&…...
阿里推出全新推理模型(因果语言模型),仅1/20参数媲美DeepSeek R1
阿里Qwen 团队正式发布了他们最新的研究成果——QwQ-32B大语言模型!这款模型不仅名字萌萌哒(QwQ),实力更是不容小觑!😎 QwQ-32B 已在 Hugging Face 和 ModelScope 开源,采用了 Apache 2.0 开源协议。大家可通过 Qwen C…...
vue实现一个pdf在线预览,pdf选择文本并提取复制文字触发弹窗效果
[TOC] 一、文件预览 1、安装依赖包 这里安装了disjs-dist2.16版本,安装过程中报错缺少worker-loader npm i pdfjs-dist2.16.105 worker-loader3.0.8 2、模板部分 <template><div id"pdf-view"><canvas v-for"page in pdfPages&qu…...
Unity自定义渲染管线(Scriptable Render Pipeline)架构设计与实现指南
一、SRP技术体系概述 1. 核心设计理念 全托管渲染控制:通过C#脚本完全掌控渲染流程 模块化架构:将渲染流程拆分为可组合的RenderPass GPU友好设计:支持CommandBuffer与Compute Shader混合编程 对惹,这里有一个游戏开发交流小组…...
时间复杂度分析与递归,以新南UNSW的COMP2521作业题为例
作者:Smooth(连接教育高级讲师) 首发于:UNSW学习知识库(UNSW Study Wiki) 创作时间:2025年3月5日 如何测度算法的时间性能?理论分析Theoretical Analysis 测度算法时…...
RxJS与Redux革命性协同:打造高效、解耦的前端状态管理方案
摘要 本文探讨RxJS与Redux的融合应用,通过真实用户场景揭示其必要性,系统讲解整合策略,从基础到高级涵盖响应式编程优化、异步操作处理、状态流控制等核心主题。提供可落地的架构方案与性能优化技巧,包含10可复用代码示例和20实战…...
