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 …...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...

Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
前言:本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中,跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南,你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案,并结合内网…...
怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)
+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...
Python第七周作业
Python第七周作业 文章目录 Python第七周作业 1.使用open以只读模式打开文件data.txt,并逐行打印内容 2.使用pathlib模块获取当前脚本的绝对路径,并创建logs目录(若不存在) 3.递归遍历目录data,输出所有.csv文件的路径…...

【QT控件】显示类控件
目录 一、Label 二、LCD Number 三、ProgressBar 四、Calendar Widget QT专栏:QT_uyeonashi的博客-CSDN博客 一、Label QLabel 可以用来显示文本和图片. 核心属性如下 代码示例: 显示不同格式的文本 1) 在界面上创建三个 QLabel 尺寸放大一些. objectName 分别…...