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 …...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
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源文件需要同步,点…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...
