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文件。下面是关键代码。

有一个考点,IDA会把内存的数据自动转为大端序,有时候伪代码却不会,所以要谨慎小心!

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是adsfkndcls。

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

这看似是一个死循环,其实根据putchar(32)来看只要v3和keylen相等就可以跳过了,也就是说每一次循环v2都++,v2控制的是str里面的字符串。而v3则是一个计数器,只要数值超过keylen就会break了。str2我们也知道等于text,key我们也知道了。后面的%26+97相当于转为小写而已。

[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)

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

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

相关文章

OceanBase-obcp-v3考试资料梳理

集群架构 基本概念 集群: 集群由一个或多个Region组成,Region 由一个或多个Zone组成,Zone由一个或多个OBServer组成,每个OBServer里有若干个partition的Replica。 Region: 对应物理上的一个城市或地域,当OB集群由多个Region组成时, 数据库的数据和服务能力就具备地域…

【C++】双指针算法

我们还有更长的路要走&#xff0c;不过没关系&#xff0c;道路就是生活。 前言 这是我自己学习蓝桥杯算法的第一篇博客总结。后期我会继续把蓝桥杯算法学习笔记开源至博客上。 技巧 1. 双指针算法&#xff0c;但实际上是利用数组下标来充当指针&#xff0c;并不是直接使用指…

如何使用MyBatis进行多表查询

前言 在实际开发中&#xff0c;对数据库的操作通常会涉及多张表&#xff0c;MyBatis提供了关联映射&#xff0c;这些关联映射可以很好地处理表与表&#xff0c;对象与对象之间的的关联关系。 一对一查询 步骤&#xff1a; 先确定表的一对一关系确定好实体类&#xff0c;添加关…

江科大51单片机笔记【9】DS1302实时时钟(上)

一、DS1302介绍 DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时&#xff0c;且具有闰年补偿等多种功能。RTC&#xff08;Real Time Clock&#xff09;&#xff1a;实时时钟&#xff0c;是一种集成电路…

【Python项目】基于深度学习的车辆特征分析系统

【Python项目】基于深度学习的车辆特征分析系统 技术简介&#xff1a;采用Python技术、MySQL数据库、卷积神经网络&#xff08;CNN&#xff09;等实现。 系统简介&#xff1a;该系统基于深度学习技术&#xff0c;特别是卷积神经网络&#xff08;CNN&#xff09;&#xff0c;用…

汽车智能钥匙中PKE低频天线的作用

PKE&#xff08;Passive Keyless Entry&#xff09;即被动式无钥匙进入系统&#xff0c;汽车智能钥匙中PKE低频天线在现代汽车的智能功能和安全保障方面发挥着关键作用&#xff0c;以下是其具体作用&#xff1a; 信号交互与身份认证 低频信号接收&#xff1a;当车主靠近车辆时…

大模型AI平台DeepSeek 眼中的SQL2API平台:QuickAPI、dbapi 和 Magic API 介绍与对比

目录 1 QuickAPI 介绍 2 dbapi 介绍 3 Magic API 介绍 4 简单对比 5 总结 统一数据服务平台是一种低代码的方式&#xff0c;实现一般是通过SQL能直接生成数据API&#xff0c;同时能对产生的数据API进行全生命周期的管理&#xff0c;典型的SQL2API的实现模式。 以下是针对…

【CF】C. Tokitsukaze and Two Colorful Tapes+C. Where is the Pizza?

https://codeforces.com/contest/1677/problem/C https://codeforces.com/contest/1670/problem/C 两道很像的的题目&#xff0c;都和环有关 C. Tokitsukaze and Two Colorful Tapes 题目&#xff1a; 思路&#xff1a; 题意就是给定你两排颜色&#xff0c;要求在相同的颜色…

leetcode0020 - 有效的括号 easy

1 题目&#xff1a;有效的括号 给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。 左括号必须…

基于提示驱动的潜在领域泛化的医学图像分类方法(Python实现代码和数据分析)

摘要 医学图像分析中的深度学习模型易受数据集伪影偏差、相机差异、成像设备差异等导致的分布偏移影响&#xff0c;导致在真实临床环境中诊断不可靠。领域泛化&#xff08;Domain Generalization, DG&#xff09;方法旨在通过多领域训练提升模型在未知领域的性能&#xff0c;但…

【STM32】玩转IIC之驱动MPU6050及姿态解算

目录 前言 一.MPU6050模块介绍 1.1MPU6050简介 1.2 MPU6050的引脚定义 1.3MPU6050寄存器解析 二.MPU6050驱动开发 2.1 配置寄存器 2.2对MPU6050寄存器进行读写 2.2.1 写入寄存器 2.2.2读取寄存器 2.3 初始化MPU6050 2.3.1 设置工作模式 2.3.2 配置采样率 2.3.3 启…

【C#】async与await介绍

1. 实例1 1.1 代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace ConsoleApp1 {class Program{static void Main(string[] args){Method1();Method2();Console.ReadKey();}public static…

Gitlab配置personal access token

1.点击左上角个人账号 -> Preferences 2. 点击左边栏 Access Tokens 3. 点击Add new token &#xff0c;输入token名称&#xff0c;勾选权限&#xff08;注意截至日期 “Expiration date” 可不填&#xff09; 4. 创建成功后&#xff0c;显示token信息&#xff0c;复制到本地…

盛铂科技 SLMF315频率综合器200MHz至15GHz 国产频综模块

在当今科技飞速发展的时代&#xff0c;射频技术在众多领域发挥着关键作用&#xff0c;从通信、雷达系统到科研实验&#xff0c;对频率综合器的性能要求日益严苛。以下是关于盛铂科技的 SLMF315 超低相位噪声频率综合器的介绍&#xff1a; SLMF315超低相位噪声0.2至15GHz频率综合…

Java 大视界 -- 基于 Java 的大数据分布式任务调度系统设计与实现(117)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

C++学习之路,从0到精通的征途:入门基础

目录 一.C的第一个程序 二.命名空间 1.namespace的价值 2.命名空间的定义 3.命名空间使用 三.C的输入与输出 1.<iostream> 2.流 3.std(standard) 四.缺省参数 1.缺省参数的定义 2.全缺省/半缺省 3.声明与定义 ​五.函数重载 1.参数个数不同 2.参数类型不…

用低代码平台集成人工智能:无需专业开发也能实现智能化

引言&#xff1a;人工智能的普及与企业需求 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;越来越多的企业开始意识到其在提升运营效率、优化客户体验和推动业务创新方面的巨大潜力。从智能客服到自动化决策支持&#xff0c;从数据分析到个性化推荐&#x…

【Git】linux搭建Gitea配置mysql数据库

WindowsServer搭建内网Gitea【中文更方便使用】 1. 安装Gitea # 下载 wget https://dl.gitea.io/gitea/1.23.5/gitea-1.23.5-linux-amd642. 创建用户 # 创建 gitea 用户 sudo adduser --system --shell /bin/bash --comment Git Version Control --create-home --home-dir /…

RLHF-GRPO

RLHF&#xff08;Reinforcement Learning fromHuman Feedback&#xff0c;人类反馈强化学习&#xff09; 目的&#xff1a;为了让大模型的输出更贴合人类的偏好&#xff0c;拟合有用真实无害的结果。 思维导图 方法对比 发布时间&#xff1a;最初是采用PPO&#xff0c;但是后…

PIPC:基于博世冰羚Iceoryx的功能安全增强型通信框架

ICEORYX: 博世在量产ADAS领域装配率长期占据市场前三的份额,他们对于如何将自动驾驶数据高效流转的需求更为迫切,为此在大神Michael Phnl带领下,专门为自动驾驶开发了一套中文名叫“冰羚”,英文名ICEORYX的中间件。 如上面所说,大量自动驾驶相关的感知数据需要在整个系…