当前位置: 首页 > article >正文

CTF show 数学不及格

拿到题目先查一下壳,看一下信息

发现是一个ELF文件,64位的

用IDA Pro 64 打开这个文件

然后点击F5进行伪代码转换

可以看到有五个if判断,第一个argc != 5这个判断并没有起太大作用,主要是下面四个if判断

根据题目,其实可以判断出来,这个就是一道数学题

现在开始逐步分析一下代码

赋值操作:

strtol函数,作用是把字符串转成长整型,具体解释看这个C 库函数 – strtol() | 菜鸟教程

然后将v4传入f函数,剩下的v10,v11,v12和v4一样的操作,这里主要就是f函数

然后下面这几个if判断,可以理解为几个方程

假设x = v4,y = v9, a = v10,b = v11, c = v12,那么就有下面几个方程:

y - a = 151381742876(这里将十六进制转换成十进制了,下面的类同)

y - b = 117138004530

y - c = 155894355749

x + a + b + c = 1349446086540

很明显,五个未知数,四个方程解不出来的,这里还有一个点就是v9是通过v4得出的,也就是v9和v4还有关联,只要求出来一个,所有的都可以解出来了

现在查看一下f函数的内容

可以看到传进去的v4也就是这个局部变量的a1,是有限制的,即,1 < a1 <= 200

所以就知道了v4的取值范围也是(1-200]

那就根据这些条件,话不多说直接上脚本

#include <stdio.h>
#include <windows.h>
#include <inttypes.h>uint64_t y(int var_24);int main() 
{uint64_t v10, v11, v12 ,argv = 0;uint64_t dbNumber = 0;for (int v4 = 1; v4 < 200; ++v4){dbNumber = y(v4);v10 = dbNumber - 151381742876;v11 = dbNumber - 117138004530;v12 = dbNumber - 155894355749;argv = v4 + 25923;if (v4 + v12 + v11 + v10 == 1349446086540){printf("v9=%" PRIX64 ",v10=%" PRIX64 ",v11=%" PRIX64 ",v12=%" PRIX64 ",v4=%X,argv=%" PRIX64 "\r\n", dbNumber, v10, v11, v12, v4,argv);printf("%" PRIX64 "%" PRIX64 "%" PRIX64 "%" PRIX64 "\r\n", v10, v11, v12, argv);}}system("pause");
}uint64_t y(int var_24)
{uint64_t *ptr;uint64_t var_10;uint64_t var_14;if (var_24 <= 1){return 0;}else if (var_24 <= 200){ptr = (uint64_t *)malloc(var_24 * 8);ptr[0] = 1;ptr[1] = 1;var_10 = 0;for (var_14 = 2; var_14 < var_24; ++var_14){ptr[var_14] = ptr[var_14 - 1] + ptr[var_14 - 2];var_10 = ptr[var_14];}free(ptr);return var_10;}
}

下面开始分析这个脚本的作用,以及如何写成的

首先,其中定义的变量都用了uint64_t,原因是,在我最开始写这个脚本的时候,用的long long型定义的,发现还是放不下其中的数值,数值貌似是5000亿,所以这里将所有的变量都改为uint64_t,不过用uint64_t的时候,需要包含头文件inttypes.h

类型位数是否有符号等效传统类型备注
uint64_t64无符号unsigned long long保证64位
unsigned long long至少64无符号-可能比64位更大(依赖平台)
size_t平台相关无符号-通常用于表示内存大小
uint32_t32无符号unsigned int32位无符号

然后接着往下分析,整体代码中除了主函数(main)还有一个y函数,这个等同于IDA中的f函数,也就是我将f函数的伪代码转换成C语言了,也就是用来计算IDA中v9的值

然后我main函数中,有一个for循环,这里我的思路是爆破v4的值,然后前面分析也知道了v4的值在(1,200]之间,所以利用一个for循环遍历v4,并将v4传入y函数中,用dbNumber接收返回值,这里dbNumber等同于IDA中的v9

然后v10、v11、v12的值都是通过dbNumber求出来的,也就是根据前面列的方程求

然后再加了一个if语句,是为了判断v4的值是否正确,也就是看看当前根据爆破出来的v4值求出来的v10、v11、v12是否正确,如果正确,那就全部输出出来

最后这个printf的用法,跟正常使用的时候不一样,这是为啥呢,因为我们定义的变量都是uint64_t,而printf 系列函数中,能正确格式化输出 uint64_t 类型的变量的就是PRIX64

  • 宏名称PRIx64

    • PRI:表示 "print"(格式化输出)

    • x:表示十六进制小写输出(X 表示大写十六进制)

    • 64:表示64位宽度

脚本的所有地方都解释清楚了,直接运行

可以看到,第一行是当时为了调试,看看所有变量有没有正确输出,第二行才是真正的flag,也就是将所有变量拼接起来,拼接顺序是v10、v11、v12、argv,为什么呢,因为在IDA中,赋值的地方就看到了v10是argv[1],v11是argv[2],v12是argv[3],v4是argv[4] - 25923,所以argv[4]=v4+25923,也就是我脚本中的argv变量

最后将得到的一串十六进制数复制到厨子中进行十六进制解密,就得到flag了


最后多说一句

如果师傅们还需要更多的资料,欢迎进入泷羽Sec资源库,里面不仅包含了各种面试题,还有各种网课资源,各种源码分享

        泷羽Sec资料库,加入泷羽Sec帮会,享受各种IT资源,资源持续更新中

        加入帮会-发现更有料的网安圈

           

相关文章:

CTF show 数学不及格

拿到题目先查一下壳&#xff0c;看一下信息 发现是一个ELF文件&#xff0c;64位的 ​ 用IDA Pro 64 打开这个文件 ​ 然后点击F5进行伪代码转换 可以看到有五个if判断&#xff0c;第一个argc ! 5这个判断并没有起太大作用&#xff0c;主要是下面四个if判断 ​ 根据题目…...

React父子组件通信:Props怎么用?如何从父组件向子组件传递数据?

系列回顾&#xff1a; 在上一篇《React核心概念&#xff1a;State是什么&#xff1f;》中&#xff0c;我们学习了如何使用useState让一个组件拥有自己的内部数据&#xff08;State&#xff09;&#xff0c;并通过一个计数器案例&#xff0c;实现了组件的自我更新。这很棒&#…...

【大模型】RankRAG:基于大模型的上下文排序与检索增强生成的统一框架

文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点 C 模型结构C.1 指令微调阶段C.2 排名与生成的总和指令微调阶段C.3 RankRAG推理&#xff1a;检索-重排-生成 D 实验设计E 个人总结 A 论文出处 论文题目&#xff1a;RankRAG&#xff1a;Unifying Context Ranking…...

LangChain【6】之输出解析器:结构化LLM响应的关键工具

文章目录 一 LangChain输出解析器概述1.1 什么是输出解析器&#xff1f;1.2 主要功能与工作原理1.3 常用解析器类型 二 主要输出解析器类型2.1 Pydantic/Json输出解析器2.2 结构化输出解析器2.3 列表解析器2.4 日期解析器2.5 Json输出解析器2.6 xml输出解析器 三 高级使用技巧3…...

【深尚想】TPS54618CQRTERQ1汽车级同步降压转换器电源芯片全面解析

1. 元器件定义与技术特点 TPS54618CQRTERQ1 是德州仪器&#xff08;TI&#xff09;推出的一款 汽车级同步降压转换器&#xff08;DC-DC开关稳压器&#xff09;&#xff0c;属于高性能电源管理芯片。核心特性包括&#xff1a; 输入电压范围&#xff1a;2.95V–6V&#xff0c;输…...

如何把工业通信协议转换成http websocket

1.现状 工业通信协议多数工作在边缘设备上&#xff0c;比如&#xff1a;PLC、IOT盒子等。上层业务系统需要根据不同的工业协议做对应开发&#xff0c;当设备上用的是modbus从站时&#xff0c;采集设备数据需要开发modbus主站&#xff1b;当设备上用的是西门子PN协议时&#xf…...

高效的后台管理系统——可进行二次开发

随着互联网技术的迅猛发展&#xff0c;企业的数字化管理变得愈加重要。后台管理系统作为数据存储与业务管理的核心&#xff0c;成为了现代企业不可或缺的一部分。今天我们要介绍的是一款名为 若依后台管理框架 的系统&#xff0c;它不仅支持跨平台应用&#xff0c;还能提供丰富…...

深入解析光敏传感技术:嵌入式仿真平台如何重塑电子工程教学

一、光敏传感技术的物理本质与系统级实现挑战 光敏电阻作为经典的光电传感器件&#xff0c;其工作原理根植于半导体材料的光电导效应。当入射光子能量超过材料带隙宽度时&#xff0c;价带电子受激发跃迁至导带&#xff0c;形成电子-空穴对&#xff0c;导致材料电导率显著提升。…...

拟合问题处理

在机器学习中&#xff0c;核心任务通常围绕模型训练和性能提升展开&#xff0c;但你提到的 “优化训练数据解决过拟合” 和 “提升泛化性能解决欠拟合” 需要结合更准确的概念进行梳理。以下是对机器学习核心任务的系统复习和修正&#xff1a; 一、机器学习的核心任务框架 机…...

leetcode_69.x的平方根

题目如下 &#xff1a; 看到题 &#xff0c;我们最原始的想法就是暴力解决: for(long long i 0;i<INT_MAX;i){if(i*ix){return i;}else if((i*i>x)&&((i-1)*(i-1)<x)){return i-1;}}我们直接开始遍历&#xff0c;我们是整数的平方根&#xff0c;所以我们分两…...

大模型——基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程

基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程 下载安装Docker Docker官网:https://www.docker.com/ 自定义Docker安装路径 Docker默认安装在C盘,大小大概2.9G,做这行最忌讳的就是安装软件全装C盘,所以我调整了下安装路径。 新建安装目录:E:\MyS…...

32位寻址与64位寻址

32位寻址与64位寻址 32位寻址是什么&#xff1f; 32位寻址是指计算机的CPU、内存或总线系统使用32位二进制数来标识和访问内存中的存储单元&#xff08;地址&#xff09;&#xff0c;其核心含义与能力如下&#xff1a; 1. 核心定义 地址位宽&#xff1a;CPU或内存控制器用32位…...

2.2.2 ASPICE的需求分析

ASPICE的需求分析是汽车软件开发过程中至关重要的一环&#xff0c;它涉及到对需求进行详细分析、验证和确认&#xff0c;以确保软件产品能够满足客户和用户的需求。在ASPICE中&#xff0c;需求分析的关键步骤包括&#xff1a; 需求细化&#xff1a;将从需求收集阶段获得的高层需…...

深度解析:etcd 在 Milvus 向量数据库中的关键作用

目录 &#x1f680; 深度解析&#xff1a;etcd 在 Milvus 向量数据库中的关键作用 &#x1f4a1; 什么是 etcd&#xff1f; &#x1f9e0; Milvus 架构简介 &#x1f4e6; etcd 在 Milvus 中的核心作用 &#x1f527; 实际工作流程示意 ⚠️ 如果 etcd 出现问题会怎样&am…...

2025-05-08-deepseek本地化部署

title: 2025-05-08-deepseek 本地化部署 tags: 深度学习 程序开发 2025-05-08-deepseek 本地化部署 参考博客 本地部署 DeepSeek&#xff1a;小白也能轻松搞定&#xff01; 如何给本地部署的 DeepSeek 投喂数据&#xff0c;让他更懂你 [实验目的]&#xff1a;理解系统架构与原…...

js 设置3秒后执行

如何在JavaScript中延迟3秒执行操作 在JavaScript中&#xff0c;要设置一个操作在指定延迟后&#xff08;例如3秒&#xff09;执行&#xff0c;可以使用 setTimeout 函数。setTimeout 是JavaScript的核心计时器方法&#xff0c;它接受两个参数&#xff1a; 要执行的函数&…...

Tauri2学习笔记

教程地址&#xff1a;https://www.bilibili.com/video/BV1Ca411N7mF?spm_id_from333.788.player.switch&vd_source707ec8983cc32e6e065d5496a7f79ee6 官方指引&#xff1a;https://tauri.app/zh-cn/start/ 目前Tauri2的教程视频不多&#xff0c;我按照Tauri1的教程来学习&…...

从零手写Java版本的LSM Tree (一):LSM Tree 概述

&#x1f525; 推荐一个高质量的Java LSM Tree开源项目&#xff01; https://github.com/brianxiadong/java-lsm-tree java-lsm-tree 是一个从零实现的Log-Structured Merge Tree&#xff0c;专为高并发写入场景设计。 核心亮点&#xff1a; ⚡ 极致性能&#xff1a;写入速度超…...

在Zenodo下载文件 用到googlecolab googledrive

方法&#xff1a;Figshare/Zenodo上的数据/文件下载不下来&#xff1f;尝试利用Google Colab &#xff1a;https://zhuanlan.zhihu.com/p/1898503078782674027 参考&#xff1a; 通过Colab&谷歌云下载Figshare数据&#xff0c;超级实用&#xff01;&#xff01;&#xff0…...

FOPLP vs CoWoS

以下是 FOPLP&#xff08;Fan-out panel-level packaging 扇出型面板级封装&#xff09;与 CoWoS&#xff08;Chip on Wafer on Substrate&#xff09;两种先进封装技术的详细对比分析&#xff0c;涵盖技术原理、性能、成本、应用场景及市场趋势等维度&#xff1a; 一、技术原…...

CppCon 2015 学习:REFLECTION TECHNIQUES IN C++

关于 Reflection&#xff08;反射&#xff09; 这个概念&#xff0c;总结一下&#xff1a; Reflection&#xff08;反射&#xff09;是什么&#xff1f; 反射是对类型的自我检查能力&#xff08;Introspection&#xff09; 可以查看类的成员变量、成员函数等信息。反射允许枚…...

【1】跨越技术栈鸿沟:字节跳动开源TRAE AI编程IDE的实战体验

2024年初&#xff0c;人工智能编程工具领域发生了一次静默的变革。当字节跳动宣布退出其TRAE项目&#xff08;一款融合大型语言模型能力的云端AI编程IDE&#xff09;时&#xff0c;技术社区曾短暂叹息。然而这一退场并非终点——通过开源社区的接力&#xff0c;TRAE在WayToAGI等…...

高端性能封装正在突破性能壁垒,其芯片集成技术助力人工智能革命。

2024 年&#xff0c;高端封装市场规模为 80 亿美元&#xff0c;预计到 2030 年将超过 280 亿美元&#xff0c;2024-2030 年复合年增长率为 23%。 细分到各个终端市场&#xff0c;最大的高端性能封装市场是“电信和基础设施”&#xff0c;2024 年该市场创造了超过 67% 的收入。…...

前端工具库lodash与lodash-es区别详解

lodash 和 lodash-es 是同一工具库的两个不同版本&#xff0c;核心功能完全一致&#xff0c;主要区别在于模块化格式和优化方式&#xff0c;适合不同的开发环境。以下是详细对比&#xff1a; 1. 模块化格式 lodash 使用 CommonJS 模块格式&#xff08;require/module.exports&a…...

动态规划-1035.不相交的线-力扣(LeetCode)

一、题目解析 光看题目要求和例图&#xff0c;感觉这题好麻烦&#xff0c;直线不能相交啊&#xff0c;每个数字只属于一条连线啊等等&#xff0c;但我们结合题目所给的信息和例图的内容&#xff0c;这不就是最长公共子序列吗&#xff1f;&#xff0c;我们把最长公共子序列连线起…...

网页端 js 读取发票里的二维码信息(图片和PDF格式)

起因 为了实现在报销流程中&#xff0c;发票不能重用的限制&#xff0c;发票上传后&#xff0c;希望能读出发票号&#xff0c;并记录发票号已用&#xff0c;下次不再可用于报销。 基于上面的需求&#xff0c;研究了OCR 的方式和读PDF的方式&#xff0c;实际是可行的&#xff…...

MeshGPT 笔记

[2311.15475] MeshGPT: Generating Triangle Meshes with Decoder-Only Transformers https://library.scholarcy.com/try 真正意义上的AI生成三维模型MESHGPT来袭&#xff01;_哔哩哔哩_bilibili GitHub - lucidrains/meshgpt-pytorch: Implementation of MeshGPT, SOTA Me…...

Appium下载安装配置保姆教程(图文详解)

目录 一、Appium软件介绍 1.特点 2.工作原理 3.应用场景 二、环境准备 安装 Node.js 安装 Appium 安装 JDK 安装 Android SDK 安装Python及依赖包 三、安装教程 1.Node.js安装 1.1.下载Node 1.2.安装程序 1.3.配置npm仓储和缓存 1.4. 配置环境 1.5.测试Node.j…...

qt+vs Generated File下的moc_和ui_文件丢失导致 error LNK2001

qt 5.9.7 vs2013 qt add-in 2.3.2 起因是添加一个新的控件类&#xff0c;直接把源文件拖进VS的项目里&#xff0c;然后VS卡住十秒&#xff0c;然后编译就报一堆 error LNK2001 一看项目的Generated Files下的moc_和ui_文件丢失了一部分&#xff0c;导致编译的时候找不到了。因…...

41道Django高频题整理(附答案背诵版)

解释一下 Django 和 Tornado 的关系&#xff1f; Django和Tornado都是Python的web框架&#xff0c;但它们的设计哲学和应用场景有所不同。 Django是一个高级的Python Web框架&#xff0c;鼓励快速开发和干净、实用的设计。它遵循MVC设计&#xff0c;并强调代码复用。Django有…...