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-littleRELRO:      Full RELROStack:      No canary foundNX:         NX unknown - GNU_STACK missingPIE:        PIE enabledStack:      ExecutableRWX:        Has RWX segmentsSHSTK:      EnabledIBT:        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); // 复制查询字符串到 ssub_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; // 将操作符保存到 v12v16 = 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        - 映射偏移量为 0v2 = (__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.rhkb.cn/news/483715.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TYUT设计模式精华版

七大原则 单一职责原则 职责要单一不能将太多的职责放在一个类中 开闭原则 软件实体对扩展是开放的&#xff0c;但对修改是关闭的 里氏代换原则 一个可以接受基类对象的地方必然可以接受子类 依赖倒转原则 要针对抽象层编程&#xff0c;而不要针对具体类编程 接口隔离原则 …

Android 使用OpenGLES + MediaPlayer 获取视频截图

概述 Android 获取视频缩略图的方法通常有: ContentResolver: 使用系统数据库MediaMetadataRetriever: 这个是android提供的类&#xff0c;用来获取本地和网络media相关文件的信息ThumbnailUtils: 是在android2.2&#xff08;api8&#xff09;之后新增的一个&#xff0c;该类为…

论文阅读——量子退火Experimental signature of programmable quantum annealing

摘要&#xff1a;量子退火是一种借助量子绝热演化解决复杂优化问题的通用策略。分析和数值证据均表明&#xff0c;在理想化的封闭系统条件下&#xff0c;量子退火可以胜过基于经典热化的算法&#xff08;例如模拟退火&#xff09;。当前设计的量子退火装置的退相干时间比绝热演…

Vue框架开发一个简单的购物车(Vue.js)

让我们利用所学知识来开发一个简单的购物车 &#xff08;记得暴露属性和方法&#xff01;&#xff01;&#xff01;&#xff09; 首先来看一下最基本的一个html框架 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"&…

瑞芯微方案主板Linux修改系统串口波特率教程,触觉智能RK3562开发板演示

遇到部分串口工具不支持1500000波特率&#xff0c;这时候就需要进行修改&#xff0c;本文以触觉智能RK3562开发板修改系统波特率为115200为例&#xff0c;介绍瑞芯微方案主板Linux修改系统串口波特率教程。 温馨提示&#xff1a;瑞芯微方案主板/开发板串口波特率只支持115200或…

攻防世界-fileclude-文件包含

赛前回顾 1.题目打开后是文件包含的代码&#xff0c;如下 函数作用 highlight_file(__FILE__) //显示代码到网页 isset //检查变量是否存在并且非null(空) !empty //php内置函数&#xff0c;检查变量是否为空或未设置&#xff0c;正常变量为空会触发&#xff0c;但是有个…

039集——渐变色之:CAD中画彩虹()(CAD—C#二次开发入门)

&#xff08;来左边儿 跟我一起画个龙&#xff0c;在你右边儿 画一道彩虹 ~~~~~~~~~~~ &#xff09; 效果如下&#xff1a; 以下展示部分颜色源码&#xff1a; namespace AcTools {public class Class1{public Wform.Timer timer;//定时器需建在类下面public s…

Spark和MapReduce场景应用和区别

文章目录 Spark和MapReduce场景应用和区别一、引言二、MapReduce和Spark的应用场景1. MapReduce的应用场景2. Spark的应用场景 三、MapReduce和Spark的区别1. 内存使用和性能2. 编程模型和易用性3. 实时计算支持 四、使用示例1. MapReduce代码示例2. Spark代码示例 五、总结 Sp…

泛化调用 :在没有接口的情况下进行RPC调用

什么是泛化调用&#xff1f; 在RPC调用的过程中&#xff0c;调用端向服务端发起请求&#xff0c;首先要通过动态代理&#xff0c;动态代理可以屏蔽RPC处理流程&#xff0c;使得发起远程调用就像调用本地一样。 RPC调用本质&#xff1a;调用端向服务端发送一条请求消息&#x…

D87【python 接口自动化学习】- pytest基础用法

day87 pytest运行参数 -m -k 学习日期&#xff1a;20241203 学习目标&#xff1a;pytest基础用法 -- pytest运行参数-m -k 学习笔记&#xff1a; 常用运行参数 pytest运行参数-m -k pytest -m 执行特定的测试用例&#xff0c;markers最好使用英文 [pytest] testpaths./te…

Android 应用单元测试涉及 Telephony 环境初始化问题

Telephony 相关类注入问题 SubscriptionManager Cannot invoke "android.telephony.SubscriptionManager.getActiveSubscriptionInfoList()" because "this.mSubscriptionManager" is nulljava.lang.NullPointerException: Cannot invoke "android.t…

【Spring】介绍一下 Spring 的 xml 标签以及 Bean 的常用配置

文章目录 配置标签<beans>标签<import>标签<alias> 标签自定义标签 BeanBean 常用配置Bean 作用域Bean 实例化流程Bean 生命周期 配置标签 Spring 的 xml 标签大体上分为两类&#xff0c;一种是默认标签&#xff0c;一种是自定义标签 默认标签&#xff1a;…

MySQL篇—通过官网下载linux系统下多种安装方式的MySQL社区版软件

&#x1f4ab;《博主介绍》&#xff1a;✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ &#x1f4ab;《擅长领域》&#xff1a;✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux&#xff0c;也在扩展大数据方向的知识面✌️…

大数据新视界 -- 大数据大厂之 Hive 数据压缩算法对比与选择(下)(20 / 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

有趣的Docker

&#x1f449;【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中 1. Docker 上的“全世界”命令行 你可以在 Docker 容器中运行一个模拟的 “世界地图”&#xff0c;并通过命令行与它互动。这是一个非常有趣的项目&#xff0c;结合了命令行和图形界面的交互。…

Day4:生信新手笔记 — R语言简单命令与Rstudio配置

一、Rstudio的界面展示 (很像Matlab风格) 二、Rstudio设置字体大小 三、 用Rproject管理工作目录 工作目录(working directory) 即当前所在的目录&#xff0c;是脚本、图片、文件的默认保存位置&#xff0c;也是文件读取的默认位置。R语言只能和一个文件夹进行互动&#xff0…

【ArkTS】使用AVRecorder录制音频 --内附录音机开发详细代码

系列文章目录 【ArkTS】关于ForEach的第三个参数键值 【ArkTS】“一篇带你读懂ForEach和LazyForEach” 【小白拓展】 【ArkTS】“一篇带你掌握TaskPool与Worker两种多线程并发方案” 【ArkTS】 一篇带你掌握“语音转文字技术” --内附详细代码 【ArkTS】技能提高–“用户授权”…

JavaScript实现tab栏切换

JavaScript实现tab栏切换 代码功能概述 这段代码实现了一个简单的选项卡&#xff08;Tab&#xff09;切换功能。它通过操作 HTML 元素的类名&#xff08;class&#xff09;来控制哪些选项卡&#xff08;Tab&#xff09;和对应的内容板块显示&#xff0c;哪些隐藏。基本思路是先…

【娱乐项目】基于cnchar库与JavaScript的汉字查询工具

Demo介绍 利用了 cnchar 库来进行汉字相关的信息查询&#xff0c;并展示了汉字的拼音、笔画数、笔画顺序、笔画动画等信息用户输入一个汉字后&#xff0c;点击查询按钮&#xff0c;页面会展示该汉字的拼音、笔画数、笔画顺序&#xff0c;并绘制相应的笔画动画和测试图案 cnchar…

组合问题变式——选数(dfs)

代码随想录听课笔记1——回溯算法-CSDN博客 这是从1&#xff0c;2&#xff0c;3...,n个数字中选出k个数的组合&#xff0c;输出组合的全部可能的代码 //组合&#xff1a;返回1-n中所有个数为k的组合 1,2,3,4 #include<bits/stdc.h> using namespace std; #define MAX 1…