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 …...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...

【51单片机】4. 模块化编程与LCD1602Debug
1. 什么是模块化编程 传统编程会将所有函数放在main.c中,如果使用的模块多,一个文件内会有很多代码,不利于组织和管理 模块化编程则是将各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数声明,其他.c文…...

echarts使用graphic强行给图增加一个边框(边框根据自己的图形大小设置)- 适用于无法使用dom的样式
pdf-lib https://blog.csdn.net/Shi_haoliu/article/details/148157624?spm1001.2014.3001.5501 为了完成在pdf中导出echarts图,如果边框加在dom上面,pdf-lib导出svg的时候并不会导出边框,所以只能在echarts图上面加边框 grid的边框是在图里…...

路由基础-路由表
本篇将会向读者介绍路由的基本概念。 前言 在一个典型的数据通信网络中,往往存在多个不同的IP网段,数据在不同的IP网段之间交互是需要借助三层设备的,这些设备具备路由能力,能够实现数据的跨网段转发。 路由是数据通信网络中最基…...