CTF-RE: STL逆向 [NewStarCTF 2023 公开赛道 STL] WP
多看看STL题就会了,很简单
int __fastcall main(int argc, const char **argv, const char **envp)
{__int64 v3; // rbx__int64 v4; // raxchar v5; // bl_BYTE *v6; // rax_QWORD *v7; // rax__int64 v8; // rax__int64 v9; // raxint i; // [rsp+0h] [rbp-250h]int j; // [rsp+4h] [rbp-24Ch]char v13[32]; // [rsp+10h] [rbp-240h] BYREFchar v14[32]; // [rsp+30h] [rbp-220h] BYREF__int64 v15[64]; // [rsp+50h] [rbp-200h] BYREFv15[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; // raxchar v5; // bl_BYTE *v6; // rax_QWORD *v7; // rax__int64 v8; // rax__int64 v9; // raxint i; // [rsp+0h] [rbp-250h]int j; // [rsp+4h] [rbp-24Ch]char input[32]; // [rsp+10h] [rbp-240h] BYREFchar v14[32]; // [rsp+30h] [rbp-220h] BYREF__int64 v15[64]; // [rsp+50h] [rbp-200h] BYREFv15[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 ) // 检查输入长度是否为44exit(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);// 四个一组提取到v14v7 = (_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 为 0unsigned 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 - ibyte_array[j] = byte_array[j] ^ byte_array[j + 1]flag = ''
for i in byte_array:flag += chr(i)print(flag[::-1]) # 反转
相关文章:
CTF-RE: STL逆向 [NewStarCTF 2023 公开赛道 STL] WP
多看看STL题就会了,很简单 int __fastcall main(int argc, const char **argv, const char **envp) {__int64 v3; // rbx__int64 v4; // raxchar v5; // bl_BYTE *v6; // rax_QWORD *v7; // rax__int64 v8; // rax__int64 v9; // raxint i; // [rsp0h] [rbp-250h]int j; // [r…...
实习冲刺第三十六天
46.全排列 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1: 输入:nums [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2: 输入&#…...
【Zemax光学设计实训三】---激光缩束镜的设计优化
前言与目录 技术设计要求: 设计一个激光扩束镜,使用的波长为1064nm,输入光束直径为10mm,输出光束的直径为2mm,且输入光束和输出光束平行(即平行光入射,平行光出射)。要求只使用两片…...
TCP/IP协议簇自学笔记
摘抄于大学期间记录在QQ空间的一篇自学笔记,当前清理空间,本来想直接删除掉的,但是感觉有些舍不得,因此先搬移过来。 曾经,我只知道socket函数能进行网络间数据的通信,知道tcp/ip协议也是用来进行网络数据…...
Spring Boot教程之十一:获取Request 请求 和 Put请求
如何在 Spring Boot 中获取Request Body? Java 语言是所有编程语言中最流行的语言之一。使用 Java 编程语言有几个优点,无论是出于安全目的还是构建大型分发项目。使用 Java 的优点之一是 Java 试图借助类、继承、多态等概念将语言中的每个概念与现实世…...
计算机网络(二)
ip地址:11010010:01011110:00100100:00010100 子网掩码:11111111:11111111:11111111:11000000 and :11010010:01011110:00100100:00000000 210.94.36.0的下一站为R1 因为255为11111111 192为ÿ…...
如何在Python中进行数学建模?
数学建模是数据科学中使用的强大工具,通过数学方程和算法来表示真实世界的系统和现象。Python拥有丰富的库生态系统,为开发和实现数学模型提供了一个很好的平台。本文将指导您完成Python中的数学建模过程,重点关注数据科学中的应用。 数学建…...
JavaSE——类与对象(5)
一、抽象类 1.1为什么需要抽象类 父类的某些方法,不确定怎么实现,也不需要实现。 class Animal{public String name;public Animal(String name){this.name name;}public void eat()//这里实现了也没有意义{System.out.println("这是一个动物&am…...
Istio笔记01--快速体验Istio
Istio笔记01--快速体验Istio 介绍部署与测试部署k8s安装istio测试istio 注意事项说明 介绍 Istio是当前最热门的服务网格产品,已经被广泛应用于各个云厂商和IT互联网公司。企业可以基于Istio轻松构建服务网格,在接入过程中应用代码无需更改,…...
面试小札:Java如何实现并发编程
多线程基础 继承Thread类 定义一个类继承自 Thread 类,重写 run 方法。在 run 方法中编写线程要执行的任务逻辑。例如: java class MyThread extends Thread { Override public void run() { System.out.println("线程执行的任务…...
java-a+b 开启java语法学习
代码 (ab) import java.util.Scanner; //导入 java.util包中的Scanner 类,允许读取键盘输入数据public class Main { // 创建一个公共类 Mainpublic static void main(String[] args) {//程序入口点,main方法Scanner scanner new Scanner(…...
RNN模型文本预处理--数据增强方法
数据增强方法 数据增强是自然语言处理(NLP)中常用的一种技术,通过生成新的训练样本来扩充数据集,从而提高模型的泛化能力和性能。回译数据增强法是一种常见的数据增强方法,特别适用于文本数据。 回译数据增强法 定义…...
maven 中<packaging>pom</packaging>配置使用
在 Maven 项目的 pom.xml 文件中, 元素用于指定项目的打包类型。默认情况下,如果 元素没有被显式定义,Maven 会假设其值为 jar。但是,当您设置 pom 时,这意味着该项目是一个 POM(Project Object Model&…...
【Python中while循环】
一、深拷贝、浅拷贝 1、需求 1)拷贝原列表产生一个新列表 2)想让两个列表完全独立开(针对改操作,读的操作不改变) 要满足上述的条件,只能使用深拷贝 2、如何拷贝列表 1)直接赋值 # 定义一个…...
【深度学习】服务器常见命令
1、虚拟环境的安装位置 先进入虚拟环境 which python2、升序查看文件内容 ls -ltr3、查看服务器主机空间使用情况 df -hdf -h .4、查看本地空间使用情况 du -sh ./*du -sh * | sort -nr5、查找并删除进程 # 查找 ps aux# 删除 kill -KILL pid6、查看服务器配置 lscpuuna…...
技术分析模板
文章目录 概要整体架构流程技术名词解释技术细节小结 概要 提示:这里可以添加技术概要 例如: openAI 的 GPT 大模型的发展历程。 整体架构流程 提示:这里可以添加技术整体架构 例如: 在语言模型中,编码器和解码器…...
python:文件操作
一、文件路径 在Windows系统中,每个磁盘都有自己的根目录,用分区名加反斜杠来表示。我们定位文件的位置有两种方法,一种是绝对路径,另一种是相对路径。绝对路径是从根目录出发的路径,路径中的每个路径之间用反斜杠来分…...
Nginx和Apache有什么异同?
Nginx和Apache都是广泛使用的Web服务器软件,它们各自具有独特的特点和优势,适用于不同的应用场景。以下是关于Nginx和Apache的不同、相同以及使用区别的详细分析: 一、不同点 资源占用与并发处理能力: Nginx使用更少的内存和CPU资…...
泰州榉之乡全托机构探讨:自闭症孩子精细动作训练之法
当发现自闭症孩子精细动作落后时,家长们往往会感到担忧和困惑。那么,自闭症孩子精细动作落后该如何训练呢?今天,泰州榉之乡全托机构就来为大家详细解答。 榉之乡大龄自闭症托养机构在江苏、广东、江西等地都有分校,一直…...
Cookie跨域
跨域:跨域名(IP) 跨域的目的是共享Cookie。 session操作http协议,每次既要request,也要response,cookie在创建的时候会产生一个字符串然后随着response返回。 全网站的各个页面都会带着登陆的时候的cookie …...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
