CTF-PWN: WEB_and_PWN [第一届“吾杯”网络安全技能大赛 Calculator] 赛后学习(不会)

附件

calculate.html

<!DOCTYPE html>
<html lang="en">
<head>
    <!-- 设置字符编码为 UTF-8,支持多语言字符集 -->
    <meta charset="UTF-8">
    
    <!-- 设置响应式视图,确保页面在不同设备上自适应显示 -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    
    <!-- 网页标题,显示在浏览器标签栏 -->
    <title>Calculation Result</title>
</head>
<body>
    <!-- 页面主标题 -->
    <h1>Calculation Result</h1>
    
    <!-- 显示计算结果的段落,默认显示 'Loading...' -->
    <p id="result">Loading...</p>
    
    <!-- 返回计算器页面的链接 -->
    <a href="/index.html">Back to Calculator</a>
</body>
</html>

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <!-- 设置字符编码为 UTF-8,支持多语言字符集 -->
    <meta charset="UTF-8">
    
    <!-- 设置响应式视图,确保页面在不同设备上自适应显示 -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    
    <!-- 网页标题,显示在浏览器标签栏 -->
    <title>Calculator</title>
</head>
<body>
    <!-- 页面主标题 -->
    <h1>Simple Calculator</h1>
    
    <!-- 表单用于计算操作,提交方式为 GET 请求 -->
    <form action="/calculate.html" method="get">
        
        <!-- 输入框:第一个数字,带有标签 -->
        <label for="a">Number 1:</label>
        <input type="number" id="a" name="a" required><br><br>
        
        <!-- 输入框:第二个数字,带有标签 -->
        <label for="b">Number 2:</label>
        <input type="number" id="b" name="b" required><br><br>
        
        <!-- 下拉框:选择运算符,支持加法、减法、乘法和除法 -->
        <label for="op">Operation:</label>
        <select id="op" name="op" required>
            <option value="+">+</option>
            <option value="-">-</option>
            <option value="*">*</option>
            <option value="/">/</option>
        </select><br><br>
        
        <!-- 提交按钮,触发计算操作 -->
        <button type="submit">Calculate</button>
    </form>
</body>
</html>

保护

❯ checksec --file=./pwn
[*] '/home/a5rz/Desktop/pwn/file/pwn'
    Arch:       amd64-64-little
    RELRO:      Full RELRO
    Stack:      No canary found
    NX:         NX unknown - GNU_STACK missing
    PIE:        PIE enabled
    Stack:      Executable
    RWX:        Has RWX segments
    SHSTK:      Enabled
    IBT:        Enabled

sudo运行

❯ sudo ./pwn
Server started on port 80

此html向服务器发送了这样的东西

D:/calculate.html?a=1&b=1&op=%2B

a是数字1,b是数字2,op是选择加减乘除

请添加图片描述

找到调用Page not found!的地方

__int64 __fastcall sub_1843(unsigned int a1, const char *a2) {
    // 本地变量定义,用于存储各种数据
    size_t v3; // 用于存储缓冲区的长度
    size_t v4; // 用于存储 HTTP 响应的长度
    size_t v5; // 用于存储 HTTP 错误响应的长度
    size_t v6; // 用于存储页面未找到的响应长度
    char s[512]; // 用于存储处理过的查询字符串
    char buf[256]; // 用于存储 HTTP 响应内容
    char nptr[32]; // 用于存储第一个参数(a)
    char v10; // 用于存储操作符(+、-、*、/)
    char v11[47]; // 用于存储第二个参数(b)
    char v12; // 用于存储操作符
    __int64 v13; // 用于存储第一个数字(a)
    __int64 v14; // 用于存储第二个数字(b)
    char *v15; // 用于指向查询字符串中的位置
    __int64 v16; // 用于存储计算结果

    // 判断请求的 URL 是否是“GET /index.html”或“GET / ”,如果是,则返回一个 HTML 文件
    if ( !strncmp(a2, "GET /index.html", 0xFuLL) || !strncmp(a2, "GET / ", 6uLL) ) {
        return sub_1532(a1, "index.html");
    }

    // 如果请求 URL 是“GET /calculate.html?”,则进一步处理计算逻辑
    if ( !strncmp(a2, "GET /calculate.html?", 0x14uLL) ) {
        // 找到查询字符串("?" 后面的部分)
        v15 = strchr(a2, 63); // 63 是 "?" 的 ASCII 值
        if ( v15 ) {
            // 从查询字符串开始处提取数据
            snprintf(s, 0x200uLL, "%s", ++v15); // 复制查询字符串到 s
            sub_1744(s); // 可能是对字符串 s 进行某些处理(具体实现不明)

            // 清空缓存
            nptr[0] = 0;
            v11[0] = 0;
            v10 = 0;

            // 解析查询字符串中的参数
            if ( (unsigned int)__isoc99_sscanf(s, "a=%31[^&]&b=%31[^&]&op=%256s", nptr, v11, &v10) == 3 ) {
                // 将参数转换为整数
                v14 = atoll(nptr); // 将第一个参数(a)转换为长整型
                v13 = atoll(v11); // 将第二个参数(b)转换为长整型
                v12 = v10; // 将操作符保存到 v12

                v16 = 0LL; // 默认结果为 0

                // 根据操作符执行相应的计算
                if ( v10 == 43 ) { // 如果操作符是 "+",进行加法
                    v16 = v14 + v13;
                } else if ( v12 == 45 ) { // 如果操作符是 "-",进行减法
                    v16 = v14 - v13;
                } else if ( v12 == 42 ) { // 如果操作符是 "*",进行乘法
                    v16 = v13 * v14;
                } else if ( v12 == 47 && v13 ) { // 如果操作符是 "/" 且第二个数不为零,进行除法
                    v16 = v14 / v13;
                } else {
                    v16 = 0LL; // 如果操作符无效,结果为 0
                }

                // 生成成功响应,包含计算结果
                snprintf(buf, 0x100uLL, 
                         "HTTP/1.1 200 OK\r\n"
                         "Content-Type: text/html\r\n"
                         "\r\n"
                         "<!DOCTYPE html><html><head><title>Result</title></head><body><h1>Result: %lld</h1><a href=\"/index.html\">Back"
                         " to Calculator</a></body></html>", v16);

                // 获取响应内容的长度
                v3 = strlen(buf);
                // 发送响应
                send(a1, buf, v3, 0);
                return sub_1679(v16); // 可能是处理计算结果的函数(具体实现不明)
            } else {
                // 如果查询参数不正确,返回 400 错误响应
                snprintf(buf, 0x100uLL, "HTTP/1.1 400 Bad Request\r\n\r\nInvalid query!");
                v4 = strlen(buf);
                return send(a1, buf, v4, 0);
            }
        } else {
            // 如果没有查询字符串,返回 400 错误响应
            snprintf(buf, 0x100uLL, "HTTP/1.1 400 Bad Request\r\n\r\nMissing query!");
            v5 = strlen(buf);
            return send(a1, buf, v5, 0);
        }
    } else {
        // 如果请求的 URL 不匹配,返回 404 错误响应
        snprintf(buf, 0x100uLL, "HTTP/1.1 404 Not Found\r\n\r\nPage not found!");
        v6 = strlen(buf);
        return send(a1, buf, v6, 0);
    }
}

加上calculate.html

请添加图片描述

patch反调试!(这东西卡了我好久,没注意他,我一直以为调试不上是gdb的问题)

请添加图片描述

发现一个非常奇怪的函数

__int64 __fastcall sub_1679(__int64 a1)
{
    // 定义一个指向无参函数返回__int64类型的指针 v2
    __int64 (*v2)(void); // [rsp+28h] [rbp-8h]

    // 调用 mmap 函数映射一个 8 字节的内存区域
    // mmap(0LL, 8uLL, 7, 34, -1, 0LL) 中的参数:
    // 0LL        - 映射地址从操作系统自动选择
    // 8uLL       - 映射的大小为 8 字节
    // 7          - 映射保护标志 (PROT_READ | PROT_WRITE)
    // 34         - 映射映射类型(MAP_ANONYMOUS | MAP_PRIVATE)
    // -1         - 不关联任何文件(-1 表示匿名映射)
    // 0LL        - 映射偏移量为 0
    v2 = (__int64 (*)(void))mmap(0LL, 8uLL, 7, 34, -1, 0LL);

    // 检查 mmap 是否成功,如果返回值为 -1,表示映射失败
    if (v2 == (__int64 (*)(void))-1LL)
    {
        perror("mmap failed"); // 输出错误信息
        exit(1); // 退出程序,返回错误代码 1
    }

    // 将传入的参数 a1 存储在映射区域的起始位置
    *(_QWORD *)v2 = a1;

    // 调用映射区域开始处的函数并返回其结果
    // v2 是一个指向函数的指针,因此 v2() 表示调用此函数并返回其返回值
    return v2(); // 调用并返回函数指针 v2 指向的函数结果
}

再加上栈可执行,估计出题人是想让我们利用这里,这个函数能执行任意指针

跟上一道题一样不给基地址?这题到底怎么做的爆破吗?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/928223.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用于LiDAR测量的1.58um单芯片MOPA(一)

--翻译自M. Faugeron、M. Krakowski1等人2014年的文章 1.简介 如今&#xff0c;人们对高功率半导体器件的兴趣日益浓厚&#xff0c;这些器件主要用于遥测、激光雷达系统或自由空间通信等应用。与固态激光器相比&#xff0c;半导体器件更紧凑且功耗更低&#xff0c;这在低功率供…

【maven-5】Maven 项目构建的生命周期:深入理解与应用

1. 生命周期是什么 ​在Maven出现之前&#xff0c;项目构建的生命周期就已经存在&#xff0c;软件开发人员每天都在对项目进行清理&#xff0c;编译&#xff0c;测试及部署。虽然大家都在不停地做构建工作&#xff0c;但公司和公司间&#xff0c;项目和项目间&#xff0c;往往…

数字时代的文化宝库:存储技术与精神生活

文章目录 1. 文学经典的数字传承2. 音乐的无限可能3. 影视艺术的数字化存储4. 结语 数字时代的文化宝库&#xff1a;存储技术与精神生活 在数字化的浪潮中&#xff0c;存储技术如同一座桥梁&#xff0c;连接着过去与未来&#xff0c;承载着人类文明的瑰宝。随着存储容量的不断增…

STM32标准库-FLASH

FLASH模仿EEPROM STM32本身没有自带EEPROM&#xff0c;但是自带了FLASH存储器。 STM32F103ZET6自带 1M字节的FLASH空间&#xff0c;和 128K64K的SRAM空间。 STM32F4 的 SPI 功能很强大&#xff0c;SPI 时钟最高可以到 37.5Mhz&#xff0c;支持 DMA&#xff0c;可以配置为 SPI协…

重学设计模式-工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)

在平常的学习和工作中&#xff0c;我们创建对象一般会直接用new&#xff0c;但是很多时候直接new会存在一些问题&#xff0c;而且直接new会让我们的代码变得非常繁杂&#xff0c;这时候就会巧妙的用到设计模式&#xff0c;平常我们通过力扣学习的算法可能并不会在我们工作中用到…

linux(centos) 环境部署,安装JDK,docker(mysql, redis,nginx,minio,nacos)

目录 1.安装JDK (非docker)1.1 将文件放在目录下&#xff1a; /usr/local/jdk1.2 解压至当前目录1.3 配置环境变量 2.安装docker2.1 验证centos内核2.2 安装软件工具包2.3 设置yum源2.4 查看仓库中所有docker版本&#xff0c;按需选择安装2.5 安装docker2.6 启动docker 并 开机…

算法日记 40 day 单调栈

最后两题了&#xff0c;直接上题目。 题目&#xff1a;接雨水 42. 接雨水 - 力扣&#xff08;LeetCode&#xff09; 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1…

yagmail邮件发送库:如何用Python实现自动化邮件营销?

&#x1f3a5; 作者简介&#xff1a; CSDN\阿里云\腾讯云\华为云开发社区优质创作者&#xff0c;专注分享大数据、Python、数据库、人工智能等领域的优质内容 &#x1f338;个人主页&#xff1a; 长风清留杨的博客 &#x1f343;形式准则&#xff1a; 无论成就大小&#xff0c;…

【RL Base】强化学习:信赖域策略优化(TRPO)算法

&#x1f4e2;本篇文章是博主强化学习&#xff08;RL&#xff09;领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅…

黑马2024AI+JavaWeb开发入门Day04-SpringBootWeb入门-HTTP协议-分层解耦-IOCDI飞书作业

视频地址&#xff1a;哔哩哔哩 讲义作业飞书地址&#xff1a;day04作业&#xff08;IOC&DI&#xff09; 作业很简单&#xff0c;主要是练习拆分为三层架构controller、service、dao&#xff0c;并基于IOC & DI进行解耦。 1、结构&#xff1a; 2、代码 网盘链接&…

(长期更新)《零基础入门 ArcGIS(ArcMap) 》实验三----学校选址与路径规划(超超超详细!!!)

目录 实验三 学校选址与道路规划 3.1 实验内容及目的 3.1.1 实验内容 3.1.2 实验目的 3.2 实验方案 3.3 操作流程 3.3.1 环境设置 3.3.2 地势分析 &#xff08;1&#xff09;提取坡度: (2)重分类: 3.3.3 学校点分析 (1)欧氏距离: (2)重分类: 3.3.4 娱乐场所点分析 (1)欧氏距离…

【Python网络爬虫笔记】8- (BeautifulSoup)抓取电影天堂2024年最新电影,并保存所有电影名称和链接

目录 一. BeautifulSoup的作用二. 核心方法介绍2.1 构造函数2.2 find()方法2.3 find_all()方法2.4 select()方法 三. 网络爬虫中使用BeautifulSoup四、案例爬取结果 一. BeautifulSoup的作用 解析HTML/XML文档&#xff1a;它可以将复杂的HTML或XML文本转换为易于操作的树形结构…

MATLAB期末复习笔记(中)

目录 三、MATLAB函数和程序结构 1.MATLAB文件 2.变量和数据类型 &#xff08;1&#xff09;变量 &#xff08;2&#xff09;变量类型 &#xff08;3&#xff09;字符串 3.函数文件 &#xff08;1&#xff09;函数文件规范 &#xff08;2&#xff09;子函数和私有函数 &…

算法刷题Day8:BM30 二叉搜索树与双向链表

题目 牛客网题目传送门 思路 对二叉搜索树进行中序遍历&#xff0c;结果就是按序数组。因此想办法把前面遍历过的节点给记下来&#xff0c;记作pre。当遍历到某个节点node的时候&#xff0c;令前驱指向pre&#xff0c;然后让pre的后驱指向node。 代码 class TreeNode:def…

深入解析 Dubbo 中的常见问题及优化方案: 数据量限制与配置错误20241203

&#x1f31f; 深入解析 Dubbo 中的常见问题及优化方案&#xff1a;数据量限制与配置错误 在分布式系统中&#xff0c;Dubbo 作为高性能的 RPC 框架广泛应用于企业服务化架构。然而&#xff0c;在实际使用过程中&#xff0c;开发者往往会遇到一些复杂问题&#xff0c;比如 数据…

debian ubuntu armbian部署asp.net core 项目 开机自启动

我本地的环境是 rk3399机器&#xff0c;安装armbian系统。 1.安装.net core 组件 sudo apt-get update && \sudo apt-get install -y dotnet-sdk-8.0或者安装运行库&#xff0c;但无法生成编译项目 sudo apt-get update && \sudo apt-get install -y aspnet…

【AI系统】Ascend C 编程范式

Ascend C 编程范式 AI 的发展日新月异&#xff0c;AI 系统相关软件的更新迭代也是应接不暇&#xff0c;作为一本讲授理论的作品&#xff0c;我们将尽可能地讨论编程范式背后的原理和思考&#xff0c;而少体现代码实现&#xff0c;以期让读者理解 Ascend C 为何这样设计&#x…

hadoop环境配置-创建hadoop用户+更新apt+安装SSH+配置Java环境

一、创建hadoop用户(在vm安装的ubantu上打开控制台) 1、sudo useradd -m hadoop -s /bin/bash &#xff08;创建hadoop用户&#xff09; 2、sudo passwd hadoop (设置密码) 3、sudo adduser hadoop sudo&#xff08;将新建的hadoop用户设置为管理员&#xff09; 执行如下图 将…

嵌入式系统应用-LVGL的应用-平衡球游戏 part1

平衡球游戏 part1 1 平衡球游戏的界面设计2 界面设计2.1 背景设计2.2 球的设计2.3 移动球的坐标2.4 用鼠标移动这个球2.5 增加边框规则2.6 效果图 3 为小球增加增加动画效果3.1 增加移动效果代码3.2 具体效果图片 平衡球游戏 part2 第二部分文章在这里 1 平衡球游戏的界面设计…

从被动响应到主动帮助,ProActive Agent开启人机交互新篇章

在人工智能领域&#xff0c;我们正见证着一场革命性的变革。传统的AI助手&#xff0c;如ChatGPT&#xff0c;需要明确的指令才能执行任务。但现在&#xff0c;清华大学联合面壁智能等团队提出了一种全新的主动式Agent交互范式——ProActive Agent&#xff0c;它能够主动观察环境…