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

news2024/12/5 3:20:08

附件

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 指向的函数结果
}

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32 PWM波形详细图解

目录 前言 一 PWM介绍 1.1 PWM简介 1.2 STM32F103 PWM介绍 1.3 时钟周期与占空比 二.引脚映像关系 2.1引脚映像与寄存器 2.2 复用功能映像 三. PWM 配置步骤 3.1相关原理图 3.2配置流程 3.2.1 步骤一二&#xff1a; 3.2.2 步骤三&#xff1a; 3.2.3 步骤四五六七&#xff1a; …

6.824/6.5840 Lab 1: MapReduce

宁静的夏天 天空中繁星点点 心里头有些思念 思念着你的脸 ——宁夏 完整代码见&#xff1a; https://github.com/SnowLegend-star/6.824 由于这个lab整体难度实在不小&#xff0c;故考虑再三还是决定留下代码仅供参考 6.824的强度早有耳闻&#xff0c;我终于也是到了挑战这座高…

东方隐侠网安瞭望台第8期

谷歌应用商店贷款应用中的 SpyLoan 恶意软件影响 800 万安卓用户 迈克菲实验室的新研究发现&#xff0c;谷歌应用商店中有十多个恶意安卓应用被下载量总计超过 800 万次&#xff0c;这些应用包含名为 SpyLoan 的恶意软件。安全研究员费尔南多・鲁伊斯上周发布的分析报告称&…

【python自动化一】pytest的基础使用

1.pytest简述 pytest‌ 是一个功能强大且灵活的Python测试框架&#xff0c;其主要是用于流程控制&#xff0c;具体用于UI还是接口自动化根据个人需要而定。且其具有丰富插件&#xff0c;使用时较为方便。咱们具体看下方的内容&#xff0c;本文按照使用场景展开&#xff0c;不完…

EasyDSS视频推拉流技术的应用与安防摄像机视频采集参数

安防摄像机的视频采集参数对于确保监控系统的有效性和图像质量至关重要。这些参数不仅影响视频的清晰度和流畅度&#xff0c;还直接影响存储和网络传输的需求。 安防摄像机图像效果的好坏&#xff0c;由DSP处理器和图像传感器sensor决定&#xff0c;如何利用好已有的硬件资源&…

GoReplay开源工具使用教程

目录 一、GoReplay环境搭建 1、Mac、Linux安装GoReplay环境 二、GoReplay录制与重播 1、搭建练习接口 2、录制命令 3、重播命令 三、GoReplay单个命令 1、常用命令 2、其他命令 3、命令示例 4、性能测试 5、正则表达式 四、gorepaly组合命令 1、组合命令实例 2、…

论文:IoU Loss for 2D/3D Object Detection

摘要&#xff1a;在2D/3D目标检测任务中&#xff0c;IoU (Intersection-over- Union)作为一种评价指标&#xff0c;被广泛用于评价不同探测器在测试阶段的性能。然而&#xff0c;在训练阶段&#xff0c;通常采用常见的距离损失(如L1或L2)作为损失函数&#xff0c;以最小化预测值…

CAD 文件 批量转为PDF或批量打印

CAD 文件 批量转为PDF或批量打印&#xff0c;还是比较稳定的 1.需要本地安装CAD软件 2.通过 Everything 搜索工具搜索&#xff0c;DWG To PDF.pc3 &#xff0c;获取到文件目录 &#xff0c;替换到代码中&#xff0c; originalValue ACADPref.PrinterConfigPath \ r"C:…

【错误记录】jupyter notebook打开后服务器错误Forbidden问题

如题&#xff0c;在Anaconda Prompt里输入jupyter notebook后可以打开浏览器&#xff0c;但打开具体项目后就会显示“服务器错误&#xff1a;Forbidden”&#xff0c;终端出现&#xff1a; tornado.web.HTTPError: HTTP 403: Forbidden 查看jupyter-server和jupyter notebook版…

[MacOS] [kubernetes] MacOS玩转虚拟化最佳实践

❓ 为什么不在MacOS本机安装呢&#xff1f;因为M系列芯片是Arm架构&#xff0c;与生产环境或者在本地调试时候&#xff0c;安装虚拟镜像和X86不同&#xff0c;造成不必要的切换环境的额外成本&#xff0c;所以在虚拟化的x86调试 步骤 & 详情 一: 安装OrbStack & 并配置…

网络编程相关 API 学习

目录 1. 网络编程中的基本概念 2. UDP 的 socket api 的使用 (1) DatagramSocket API (2) DatagramPacket API (3) InetSocketAddress API (4) 使用 UDP 的 socket api 3. TCP 的 socket api 的使用 (1) ServerSocket API (2) Socket API 1. 网络编程中的基本概念 客…

【Android】View工作原理

View 是Android在视觉上的呈现在界面上Android提供了一套GUI库&#xff0c;里面有很多控件&#xff0c;但是很多时候我们并不满足于系统提供的控件&#xff0c;因为这样就意味这应用界面的同类化比较严重。那么怎么才能做出与众不同的效果呢&#xff1f;答案是自定义View&#…

burp2

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…

【阅读记录-章节5】Build a Large Language Model (From Scratch)

目录 5. Pretraining on unlabeled data5.1 Evaluating generative text models5.1.1 Evaluating generative text models5.1.2 Calculating the text generation loss评估模型生成文本的质量 5.1.3 Calculating the training and validation set losses 5.2 Training an LLM5.…

Qt Qtablewidget 标题 QHeaderView 增加可选框 QcheckBox

创建自定义QHeaderView #pragma once#include <QObject> #include <QHeaderView> #include <QPainter> #include <QMouseEvent>class SSHeaderView : public QHeaderView {Q_OBJECTprivate:bool isChecked;int m_checkColIdx; public:SSHeaderView(i…

DDD架构设计

今天的应用架构&#xff0c;意指软件系统中固定不变的代码结构、设计模式、规范和组件间的通信方式。在应用开发中架构之所以是最重要的第一步&#xff0c;因为一个好的架构能让系统安全、稳定、快速迭代。在一个团队内通过规定一个固定的架构设计&#xff0c;可以让团队内能力…

再来聊聊总线机制

背景 之前写过一篇《KafkaPostgreSql&#xff0c;构建一个总线服务》&#xff0c;近期在实践过程中又踩了一些坑&#xff0c;有了一些新的体验&#xff0c;拿出来再说道说道。 我们说EventBus 是一种设计模式和编程工具&#xff0c;它简化了应用程序组件之间的通信。通过使用…

怎么做DNS污染检测

DNS污染是指通过恶意手段篡改DNS解析结果&#xff0c;导致用户访问错误或恶意网站的行为。这种行为不仅影响用户体验&#xff0c;还可能带来安全风险。以下是几种检测DNS污染的方法&#xff1a; 1. 使用在线DNS检查工具 可以使用在线工具如帝恩思旗下的拨测在线DNS检测工具等…

视频融合×室内定位×数字孪生

随着物联网技术的迅猛发展&#xff0c;室内定位与视频融合技术在各行各业中得到了广泛应用。不仅能够提供精确的位置信息&#xff0c;还能通过实时视频监控实现全方位数据的可视化。 与此同时&#xff0c;数字孪生等技术的兴起为智慧城市、智慧工厂等应用提供了强大支持&#…

合规性要求对漏洞管理策略的影响

讨论漏洞管理中持续面临的挑战&#xff0c;包括确定漏洞的优先级和解决修补延迟问题。 介绍合规性要求以及自动化如何简化漏洞管理流程。 您认为为什么尽管技术不断进步&#xff0c;但优先考虑漏洞和修补延迟等挑战仍然存在&#xff1f; 企业基础设施日益复杂&#xff0c;攻…