BUUCTF逆向刷题笔记(1-12)

news2025/4/25 4:35:46

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] BYREF
  int 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--key3
  strcpy(key, key1);                            // adsfk key1
  strcat(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");
  else
    puts("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; // eax
  int i; // [rsp+4h] [rbp-3Ch]
  int j; // [rsp+8h] [rbp-38h]
  __int64 s; // [rsp+10h] [rbp-30h] BYREF
  char 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.coloradmin.cn/o/2311057.html

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

相关文章

如何改变怂怂懦弱的气质(2)

你是否曾经因为害怕失败而逃避选择&#xff1f;是否因为不敢拒绝别人而让自己陷入困境&#xff1f;是否因为过于友善而被人轻视&#xff1f;如果你也曾为这些问题困扰&#xff0c;那么今天的博客就是为你准备的。我们将从行动、拒绝、自我认知、实力提升等多个角度&#xff0c;…

【DeepSeek】5分钟快速实现本地化部署教程

一、快捷部署 &#xff08;1&#xff09;下载ds大模型安装助手&#xff0c;下载后直接点击快速安装即可。 https://file-cdn-deepseek.fanqiesoft.cn/deepseek/deepseek_28348_st.exe &#xff08;2&#xff09;打开软件&#xff0c;点击立即激活 &#xff08;3&#xff09;选…

算法之二维装水问题

目录 1. 题目2. 解释3. 思路4. 代码5. 总结 1. 题目 给定一个数组arr&#xff0c;已知其中所有的值都是非负的&#xff0c;将这个数组看作一个容器&#xff0c;请返回容器能装多少水 比如&#xff0c;arr {3&#xff0c;1&#xff0c;2&#xff0c;5&#xff0c;2&#xff0c…

[C语言日寄] 字符串操作函数的使用及其拓展

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…

用Python的Pandas库解锁数据科学:从入门到实战

用Python的Pandas库解锁数据科学&#xff1a;从入门到实战 引言 Python的Pandas库&#xff08;名称源自"Panel Data"&#xff09;作为数据科学生态系统的基石&#xff0c;凭借其强大的数据结构和灵活的操作功能&#xff0c;已成为全球超过90%数据工作者的首选工具。…

MATLAB程序介绍,三维环境下的IMM(交互式多模型),使用CV和CT模型,EKF作为滤波

本文所述的MATLAB代码为三维的交互式多模型&#xff08;IMM&#xff09;滤波器&#xff0c;结合了匀速直线运动&#xff08;CV模型&#xff09;和匀速圆周运动&#xff08;CT模型&#xff09;的状态估计。使用扩展卡尔曼滤波&#xff08;EKF&#xff09;来处理状态更新与观测数…

[Windows] 多系统键鼠共享工具 轻松跨系统控制多台电脑

参考原文&#xff1a;[Windows] 多系统键鼠共享工具 轻松跨系统控制多台电脑 还在为多台电脑需要多套键盘鼠标而烦恼吗&#xff1f;是不是在操控 Windows、macOS、Linux 不同系统电脑时手忙脚乱&#xff1f;现在&#xff0c;这些问题通通能解决&#xff01;Deskflow 软件闪亮登…

【leetcode hot 100 48】旋转图像

方法一&#xff1a;&#xff08;原地旋转&#xff09;对于矩阵中第 i 行的第 j 个元素&#xff0c;在旋转后&#xff0c;它出现在倒数第 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 无参构造函数&#xff1a; 1.2.2 带参构造函数 1.3 构造函数的特性 1.4 默认构造函数 二、析构函数 2.1 析构函数的概念 2.2 特性 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中…

利用Ollama+AnythingLLM+本地向量数据库Milvus+本地DeepSeek大模型实现知识库的搭建

1. Ollama的搭建 基本介绍 Ollama是一个支持在Windows、Linux和MacOS上本地运行大语言模型的工具。它允许用户非常方便地运行和使用各种大语言模型,比如Qwen模型等。用户只需一行命令就可以启动模型。 Ollama 下载&#xff1a;https://ollama.com/download Ollama 官方主页&a…

攻防世界WEB(新手模式)19-file_include

先进行代码分析 include("./check.php");&#xff1a;包含并执行当前目录下的check.php文件&#xff0c;通常用于引入一些通用的函数、类或配置信息。if(isset($_GET[filename]))&#xff1a;检查是否通过 GET 请求传递了名为filename的参数。如果传递了filename参数…

Facebook 的隐私保护数据存储方案研究

Facebook 的隐私保护数据存储方案研究 在这个信息爆炸的时代&#xff0c;数据隐私保护已成为公众关注的热点。Facebook&#xff0c;作为全球最大的社交媒体平台之一&#xff0c;承载着海量用户数据&#xff0c;其隐私保护措施和数据存储方案对于维护用户隐私至关重要。本文将深…

app UI自动化测试框架都包含哪些内容?

UI自动化测试框架是指用于自动化执行用户界面(UI)相关测试的工具和库。它们可以帮助开发团队提高测试效率、发现和解决应用程序中的问题&#xff0c;并确保应用程序的正确性和稳定性。下面将详细介绍一个完整的UI自动化测试框架应该具备的内容。 1. 测试环境配置 UI自动化测试框…

Android+SpringBoot的老年人健康饮食小程序平台

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统介绍 我将从经济、生活节奏、技术融合等方面入手&#xff0c;详细阐述居家养老管理模式兴起的…

ORB-SLAM2源码学习(六):相机跟踪(局部地图跟踪和关键帧创建)

目录 1.局部地图跟踪 1.1 更新局部关键帧UpdateLocalKeyFrames 1.2 更新局部地图点&#xff08;来自局部关键帧&#xff09;UpdateLocalPoints() 1.3 投影匹配 2. 对比四种跟踪方式以及使用的投影匹配 3.关键帧创建 3.1 判断是否需要创建新关键帧: NeedNewKeyFrame() 3…

【极客时间】浏览器工作原理与实践-2 宏观视角下的浏览器 (6讲) - 2.6 渲染流程(下):HTML、CSS和JavaScript,是如何变成页面的?

https://time.geekbang.org/column/article/118826 2.6 渲染流程&#xff08;下&#xff09;&#xff1a;HTML、CSS和JavaScript&#xff0c;是如何变成页面的&#xff1f; 2.5介绍了渲染流水线中的 DOM 生成、样式计算和布局三个阶段&#xff0c;2.6讲解渲染流水线后面的阶段…

DeepSeek开源Day4:DualPipeEPLB技术详解

2 月 24 日&#xff0c;DeepSeek 启动 “开源周”&#xff0c;第四个开源的代码库为 DualPipe 与 EPLB&#xff08;一下发布了两个&#xff09;。DualPipe 与 EPLB 依然使用了大量与 Hopper 架构绑定的技术。 DualPipe 是由 DeepSeek-AI 团队开发的一种双向流水线并行通信算法&…

阿里推出全新推理模型(因果语言模型),仅1/20参数媲美DeepSeek R1

阿里Qwen 团队正式发布了他们最新的研究成果——QwQ-32B大语言模型&#xff01;这款模型不仅名字萌萌哒(QwQ)&#xff0c;实力更是不容小觑&#xff01;&#x1f60e; QwQ-32B 已在 Hugging Face 和 ModelScope 开源&#xff0c;采用了 Apache 2.0 开源协议。大家可通过 Qwen C…

vue实现一个pdf在线预览,pdf选择文本并提取复制文字触发弹窗效果

[TOC] 一、文件预览 1、安装依赖包 这里安装了disjs-dist2.16版本&#xff0c;安装过程中报错缺少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…