CTF-RE: STL逆向 [NewStarCTF 2023 公开赛道 STL] WP

news2024/12/1 9:06:44

多看看STL题就会了,很简单

int __fastcall main(int argc, const char **argv, const char **envp)
{
  __int64 v3; // rbx
  __int64 v4; // rax
  char v5; // bl
  _BYTE *v6; // rax
  _QWORD *v7; // rax
  __int64 v8; // rax
  __int64 v9; // rax
  int i; // [rsp+0h] [rbp-250h]
  int j; // [rsp+4h] [rbp-24Ch]
  char v13[32]; // [rsp+10h] [rbp-240h] BYREF
  char v14[32]; // [rsp+30h] [rbp-220h] BYREF
  __int64 v15[64]; // [rsp+50h] [rbp-200h] BYREF

  v15[61] = __readfsqword(0x28u);
  std::string::basic_string(v13, argv, envp);
  memset(v15, 0, 480);
  v15[0] = 0x2882D802120ELL;
  v15[1] = 0x28529A05954LL;
  v15[2] = 0x486088C03LL;
  v15[3] = 0xC0FB3B55754LL;
  v15[4] = 0xC2B9B7F8651LL;
  v15[5] = 0xAE83FB054CLL;
  v15[6] = 0x29ABF6DDCB15LL;
  v15[7] = 0x10E261FC807LL;
  v15[8] = 0x2A82FE86D707LL;
  v15[9] = 0xE0CB79A5706LL;
  v15[10] = 0x330560890D06LL;
  std::operator<<<std::char_traits<char>>(&std::cout, "Input Your flag:");
  std::operator>><char>(&std::cin, v13);
  if ( std::string::length(v13) != 44 )
    exit(0);
  v3 = std::string::end(v13);
  v4 = std::string::begin(v13);
  std::reverse<__gnu_cxx::__normal_iterator<char *,std::string>>(v4, v3);
  for ( i = 0; i < (unsigned __int64)(std::string::size(v13) - 1); ++i )
  {
    v5 = *(_BYTE *)std::string::operator[](v13, i + 1);
    v6 = (_BYTE *)std::string::operator[](v13, i);
    *v6 ^= v5;
  }
  for ( j = 0; j < (unsigned __int64)std::string::size(v13) >> 2; ++j )
  {
    std::string::substr(v14, v13, 4 * j, 4LL);
    v7 = (_QWORD *)std::string::operator[](v14, 0LL);
    if ( (((unsigned __int64)(unsigned int)*v7 << 15) ^ (unsigned int)*v7) != v15[j] )
    {
      v8 = std::operator<<<std::char_traits<char>>(&std::cout, "Wrong!!");
      std::ostream::operator<<(v8, &std::endl<char,std::char_traits<char>>);
      exit(0);
    }
    std::string::~string(v14);
  }
  v9 = std::operator<<<std::char_traits<char>>(&std::cout, "Right!!");
  std::ostream::operator<<(v9, &std::endl<char,std::char_traits<char>>);
  std::string::~string(v13);
  return 0;
}

加注释

int __fastcall main(int argc, const char **argv, const char **envp)
{
  __int64 v3; // rbx
  __int64 v4; // rax
  char v5; // bl
  _BYTE *v6; // rax
  _QWORD *v7; // rax
  __int64 v8; // rax
  __int64 v9; // rax
  int i; // [rsp+0h] [rbp-250h]
  int j; // [rsp+4h] [rbp-24Ch]
  char input[32]; // [rsp+10h] [rbp-240h] BYREF
  char v14[32]; // [rsp+30h] [rbp-220h] BYREF
  __int64 v15[64]; // [rsp+50h] [rbp-200h] BYREF

  v15[61] = __readfsqword(0x28u);
  std::string::basic_string(input, argv, envp);
  memset(v15, 0, 480);
  v15[0] = 0x2882D802120ELL;
  v15[1] = 0x28529A05954LL;
  v15[2] = 0x486088C03LL;
  v15[3] = 0xC0FB3B55754LL;
  v15[4] = 0xC2B9B7F8651LL;
  v15[5] = 0xAE83FB054CLL;
  v15[6] = 0x29ABF6DDCB15LL;
  v15[7] = 0x10E261FC807LL;
  v15[8] = 0x2A82FE86D707LL;
  v15[9] = 0xE0CB79A5706LL;
  v15[10] = 0x330560890D06LL;
  std::operator<<<std::char_traits<char>>(&std::cout, "Input Your flag:");// 输出
  std::operator>><char>(&std::cin, input);      // 输入
  if ( std::string::length(input) != 44 )       // 检查输入长度是否为44
    exit(0);
  v3 = std::string::end(input);                 // 返回字符串最后一个之后的
  v4 = std::string::begin(input);               // 返回第一个
  std::reverse<__gnu_cxx::__normal_iterator<char *,std::string>>(v4, v3);// std::reverse反转字符串
  for ( i = 0; i < (unsigned __int64)(std::string::size(input) - 1); ++i )
  {
    v5 = *(_BYTE *)std::string::operator[](input, i + 1);// v5 = input[i+1]
    v6 = (_BYTE *)std::string::operator[](input, i);// v6 = input[i]
    *v6 ^= v5;                                  // input[i] = input[i] ^ input[i+1]
  }
  for ( j = 0; j < (unsigned __int64)std::string::size(input) >> 2; ++j )// for(j=0;j < len(input)/4 ; j++)
  {
    std::string::substr(v14, input, 4 * j, 4LL);// 四个一组提取到v14
    v7 = (_QWORD *)std::string::operator[](v14, 0LL);// v7 = v14[0]
    if ( (((unsigned __int64)(unsigned int)*v7 << 15) ^ (unsigned int)*v7) != v15[j] )// int32强制转64,解密时候要转回来
                                                // (x << 15) ^ x = y
                                                // v15
                                                // unsigned long data[11] = {
                                                //     0x00002882D802120E, 0x0000028529A05954, 0x0000000486088C03, 0x00000C0FB3B55754, 
                                                //     0x00000C2B9B7F8651, 0x000000AE83FB054C, 0x000029ABF6DDCB15, 0x0000010E261FC807, 
                                                //     0x00002A82FE86D707, 0x00000E0CB79A5706, 0x0000330560890D06
                                                // };
    {
      v8 = std::operator<<<std::char_traits<char>>(&std::cout, "Wrong!!");
      std::ostream::operator<<(v8, &std::endl<char,std::char_traits<char>>);
      exit(0);
    }
    std::string::~string(v14);
  }
  v9 = std::operator<<<std::char_traits<char>>(&std::cout, "Right!!");
  std::ostream::operator<<(v9, &std::endl<char,std::char_traits<char>>);
  std::string::~string(input);
  return 0;
}

getflag

#include <cstdio>

/*
 * 根据给定的 y 和 n 计算出 x
 * (x << n) ^ x = y
 */
template<typename T>
T left_Solve_x_correct(T y, unsigned int n) {
    T x = 0; // 初始化 x 为 0
    unsigned int total_bits = sizeof(T) * 8; // 数据类型的总位数

    for (unsigned int i = 0; i < total_bits; ++i) {
        T y_i = (y >> i) & 1; // 提取 y 的第 i 位
        T x_i;
        if (i < n) {
            x_i = y_i; // 当 i < n 时,x_i = y_i
        } else {
            T x_prev = (x >> (i - n)) & 1; // 获取 x 中第 (i - n) 位
            x_i = y_i ^ x_prev; // x_i = y_i ^ x_{i - n}
        }
        x |= (x_i << i); // 将计算得到的 x_i 放回 x 中
    }

    return x;
}

int main() {
    unsigned long long data[11] = {
            0x00002882D802120E, 0x0000028529A05954, 0x0000000486088C03, 0x00000C0FB3B55754,
            0x00000C2B9B7F8651, 0x000000AE83FB054C, 0x000029ABF6DDCB15, 0x0000010E261FC807,
            0x00002A82FE86D707, 0x00000E0CB79A5706, 0x0000330560890D06
    };

    // 先求解第一层
    int i;
    for(i=0;i<11;i++)
        data[i] = left_Solve_x_correct(data[i], 15);
    for(i=0;i<11;i++)
        printf("0x%x,", data[i]);// 要从64转32,直接打印出来用python接着写了就不用转换了,比较方便
    printf("\n");
}

用python求解第二层

import struct

# 输入的整数数组
a = [0x5105120e, 0x50a5954, 0x90c03, 0x181f5754, 0x18570651, 0x15d054c, 0x53574b15, 0x21c4807, 0x55055707, 0x1c195706, 0x660a0d06]

# 创建一个空字节数组
byte_array = bytearray()

# 将每个整数转换为字节并按小端序添加到字节数组中
for number in a:
    byte_array.extend(struct.pack('<I', number))  # '<I'表示小端序的4字节无符号整数

# 输出结果
print(list(byte_array))  # 以列表形式输出字节数组
# 数组从0开始到43!
for i in range((len(byte_array) - 1)):
    j = 42 - i
    byte_array[j] = byte_array[j] ^ byte_array[j + 1]

flag = ''
for i in byte_array:
    flag += chr(i)

print(flag[::-1]) # 反转

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

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

相关文章

element的el-table表格标题用css自定义是否必填,用添加伪类的方式标红色*

element的el-table表格标题用css自定义是否必填添加伪类红色 * 效果图如下&#x1f447; el-table组件的html部分 css部分 /deep/.el-table__header-wrapper{.el-table__header{.has-gutter tr .el-table__cell:nth-of-type(3) .cell:before{content: *;color:red}.has-gutte…

2024 ccpc 辽宁省赛 E(构造 思维?)L(二分+一点点数论知识?)

E 题意&#xff1a; 可以注意到&#xff1a; 我的两种方格都四个方格的大小。 所以 如果存在一种摆放方式 那么 4|nm。 再考虑一种特殊的情况 22 &#xff0c;此时虽然我的积是4 但是无法摆放的。 1>对于 4 | n,或者 4 | m.我直接摆放第二种方格就可以了。 如果我n 是4 的…

【python】OpenCV—Tracking(10.5)—dlib

文章目录 1、功能描述2、代码实现3、效果展示4、完整代码5、涉及到的库函数dlib.correlation_tracker() 6、参考 1、功能描述 基于 dlib 库&#xff0c;实现指定类别的目标检测和单目标跟踪 2、代码实现 caffe 模型 https://github.com/MediosZ/MobileNet-SSD/tree/master/…

Ps:存储 Adobe PDF

在 Adobe Photoshop 中&#xff0c;将图像保存为 PDF 文件时&#xff0c; 会弹出“存储 Adobe PDF” Save Adobe PDF对话框。在此对话框中提供了多个选项&#xff0c;用于控制 PDF 文件的输出&#xff0c;包括一般设置&#xff08;选择预设、兼容性和保留编辑功能&#xff09;、…

【查询目录】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…

论文笔记(五十七)Diffusion Model Predictive Control

Diffusion Model Predictive Control 文章概括摘要1. Introduction2. Related work3. 方法3.1 模型预测控制3.2. 模型学习3.3. 规划&#xff08;Planning&#xff09;3.4. 适应 4. 实验&#xff08;Experiments&#xff09;4.1. 对于固定奖励&#xff0c;D-MPC 可与其他离线 RL…

hadoop环境配置-创建hadoop用户+更新apt+安装SSH+配置Java环境

一、创建hadoop用户(在vm安装的ubantu上打开控制台) 1、sudo useradd -m hadoop -s /bin/bash &#xff08;创建hadoop用户&#xff09; 2、sudo passwd hadoop (设置密码) 3、sudo adduser hadoop sudo&#xff08;将新建的hadoop用户设置为管理员&#xff09; 执行如下图 将…

基于 SpringBoot 的新冠密接者跟踪系统:如何实现高效信息推送功能

第2章 程序开发技术 2.1 Mysql数据库 为了更容易理解Mysql数据库&#xff0c;接下来就对其具备的主要特征进行描述。 &#xff08;1&#xff09;首选Mysql数据库也是为了节省开发资金&#xff0c;因为网络上对Mysql的源码都已进行了公开展示&#xff0c;开发者根据程序开发需要…

Python 自动化办公的 10 大脚本

大家好&#xff0c;我是你们的 Python 讲师&#xff01;今天我们将讨论 10 个实用的 Python 自动化办公脚本。这些脚本可以帮助你简化日常工作&#xff0c;提高效率。无论是处理 Excel 文件、发送邮件&#xff0c;还是自动化网页操作&#xff0c;Python 都能派上用场。 1. 批量…

Android 使用OpenGLES + MediaPlayer 获取视频截图

概述 Android 获取视频缩略图的方法通常有: ContentResolver: 使用系统数据库MediaMetadataRetriever: 这个是android提供的类&#xff0c;用来获取本地和网络media相关文件的信息ThumbnailUtils: 是在android2.2&#xff08;api8&#xff09;之后新增的一个&#xff0c;该类为…

数字化转型背景下,高职院校计算机网络应用的革新策略

在当今信息化时代&#xff0c;计算机网络已经成为高职院校教育不可或缺的一部分&#xff0c;它不仅极大地丰富了教育资源&#xff0c;提高了交流的便捷性&#xff0c;还催生了多样化的教学模式。对于高职院校来说&#xff0c;加强计算机网络应用的建设不仅是顺应时代潮流的必然…

【K230 CanMV】图像识别-摄像头获取图像 Sensor 函数全解析

引言&#xff1a;随着图像处理技术的不断发展&#xff0c;摄像头在嵌入式系统中的应用越来越广泛&#xff0c;尤其是在智能监控、自动驾驶、机器人视觉等领域。K230作为一款高性能的嵌入式处理器&#xff0c;提供了强大的图像处理能力&#xff0c;支持多种类型的摄像头接入与图…

SQL优化与性能——数据库设计优化

数据库设计优化是提高数据库性能、确保数据一致性和支持业务增长的关键环节。无论是大型企业应用还是小型项目&#xff0c;合理的数据库设计都能够显著提升系统性能、减少冗余数据、优化查询响应时间&#xff0c;并降低维护成本。本章将深入探讨数据库设计中的几个关键技术要点…

用Python做数据分析环境搭建及工具使用(Jupyter)

目录 一、Anaconda下载、安装 二、Jupyter 打开 三、Jupyter 常用快捷键 3.1 创建控制台 3.2 命令行模式下的快捷键 3.3 运行模式下快捷键 3.4 代码模式和笔记模式 3.5 编写Python代码 一、Anaconda下载、安装 【最新最全】Anaconda安装python环境_anaconda配置python…

Jmeter测试工具的安装和使用,mac版本,jmeter版本5.2.1

Jmeter测试工具的安装和使用JSON格式请求 一、安装1、安装jdk包和设置java环境2、去官网下载Jmeter3、解压后&#xff0c;打开mac终端&#xff0c;进入apache-jmeter的bin文件开启jmeter 二、使用jmeter1、添加线程2、添加HTTP请求3、配置请求的协议、IP地址、端口号、请求方法…

基于springboot 的体质测试数据分析及可视化设计LWPPT

技术可行性&#xff1a;技术背景 本企业网站在Windows操作系统中进行开发&#xff0c;并且目前PC机的性能已经可以胜任普通网站的web服务器。系统开发所使用的技术也都是自身所具有的&#xff0c;也是当下广泛应用的技术之一。 系统的开发环境和配置都是可以自行安装的&#x…

【初阶数据结构和算法】二叉树顺序结构---堆的定义与实现(附源码)

文章目录 一、堆的定义与结构二、堆的实现1.堆的初始化和销毁堆的初始化堆的销毁 2.向上调整算法和入堆向上调整算法入堆 3.向下调整算法和出堆顶数据向下调整算法出堆 4.堆的有效数据个数和判空堆的有效数据个数堆的判空 5.取堆顶数据 三、堆的源码 一、堆的定义与结构 本篇内…

黑马程序员Java笔记整理(day05)

1.面向对象编程 2.用法 3.对象是什么 4.对象在计算机中是啥 5.无参与有参构造器 小结: 6.this的作用 7.小结 8.封装 9.小结 10.实体类 11.小结 12.static 13.小结 14.static修饰方法 15.static应用前景 16.几个注意事项 17.java中可以直接用类的名字创建数组&#xff0c;如: M…

管理锻炼数据_创建类

● 这篇文章和大家一起学习创建类来管理我们的锻炼数据 ● 首先我们先创建这些类&#xff0c;然后讲锻炼数据中的数据写出来 class Workout {date new Date();constructor(coords, distance, duration) {this.coords coords;this.distance distance; //kmthis.duration du…

241127学习日志——[CSDIY] [InternStudio] 大模型训练营 [20]

CSDIY&#xff1a;这是一个非科班学生的努力之路&#xff0c;从今天开始这个系列会长期更新&#xff0c;&#xff08;最好做到日更&#xff09;&#xff0c;我会慢慢把自己目前对CS的努力逐一上传&#xff0c;帮助那些和我一样有着梦想的玩家取得胜利&#xff01;&#xff01;&…