/avr.png

Shino Channel

D3CTF2022wp-BadW3ter & d3bug

BadW3ter 当时打题目名字的时候也没有多想,后来发现Water拼错了,笑死。 文件名后面的md5码可以解出来Sh1n0,是我为了混淆题目文件名随便弄的和题目没有关系(一般会去解文件名吗,还是个md5) 发现文件头被篡改(我超,初音未来) 这里只改了RIFF区块前后和FORMAT区块开头的标识符,可以相对容易地恢复成正常的文件格式,并且得到字符串CUY1nw31lai 根据题目提示「Dive into」the w3ter, deeper and deeper.使用DeepSound解密,密码为CUY1nw31lai得到一个flag.png,直接扫发现被骗了。 查看文件头,发现并不是一个PNG文件。结合开头的II*标识和大量的Adobe Photoshop注释信息可以推测出是TIF存储格式,改后缀名后用Adobe Photoshop打开。 事实上,当文件后缀不正确的时候Photoshop是无法打开此图片的(如下图) 所以也可以把所有的图片文件后缀都试一遍(? 发现图片包含一张透明底的二维码图片和一个白底。通过大眼观察(或是Stegsolve之类的工具)是可以发现前景的二维码图片并不是纯黑的,并且颜色分布有一点微妙。在这里刻意的分层存储和非纯色的暗示意味已经非常明显了。 使用油漆桶工具将背景改为黑色。可以发现二维码内容发生了变化: 用魔棒之类的工具处理一下,扫描得到flag D3CTF{M1r@9e_T@nK_1s_Om0sh1roiii1111!!!!!Isn't_1t?} 参考:https://zhuanlan.zhihu.com/p/32532733 d3bug 这个题是拿出来当签到题的。首先通过简单分析一下题目可以得到一些限制条件,用SAT、z3solver等工具可以直接出解。 如果你不愿意使用这些工具的话: 观察到在lfsr_MyCode部分得到的每一位output相当于是前面所有位的异或和。每次移位时最高位会消失,直接把这两次得到的output随意简单异或一下就可以得到这一次消失的高位。 剩下的低位通过lfsr_CopiedfromInternet的结果可以得到一个模二加方程组(就是传统的lfsr做法),解一下就可以了 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 from Crypto.

记一次模拟登陆和验证码绕过

目标需求 因为某种原因,我需要实现一个验证某组用户名和密码是否可以成功登录网站的模块。 这里的目标网站是icoding.run. 拟使用python requests模块伪造数据包来达成目标. 数据包分析 使用BurpSuite截获发送的数据包.比较关键的是以下两个数据包: 请求验证码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 GET /verificationCode HTTP/1.1 Host: icoding.run Sec-Ch-Ua: "Chromium";v="97", " Not;A Brand";v="99" Sec-Ch-Ua-Mobile: ?0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Sec-Ch-Ua-Platform: "Windows" Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8 Sec-Fetch-Site: same-origin Sec-Fetch-Mode: no-cors Sec-Fetch-Dest: image Referer: https://icoding.run/login Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Connection: close 返回数据Headers:

使用Flask+nginx+uwsgi在服务器上部署一个简单的API接口

整体架构 (图源网络) 其中App是“应用程序”部分,负责实现功能。 WSGI,全称Web Server Gateway Interface,是Web服务器(Server)和Web应用程序(App)之间一个沟通的桥梁,是一种通信协议。 而Server则是Web服务器,负责接受来自外部的消息并通过WSGI转发给app进行处理。 需要的组件 Python3 我这里是使用阿里云的Ubuntu20.04系统镜像,自带Python环境。如果你没有Python环境,请使用百度安装一个吧 Flask Flask是一个轻量级的Python web应用框架,在架构中协助我们进行APP部分的开发。 1 2 pip install flask pip install flask_restful Nginx Nginx是一个轻量级的Web服务器,在整体架构中负责Server部分。 1 sudo apt-get install nginx uwsgi uWSGI是一个实现了WSGI协议的Web服务器。 相比于uwsgi,Nginx具备更优秀的静态内容处理能力,然后将动态内容转发给uWSGI服务器,这样可以达到相比于只用uwsgi而不使用Nginx更好的客户端相应。 1 pip insall uwsgi 宝塔Linux面板 非必须,一个辅助工具,可以帮助你更快地编辑和管理文件。 这是宝塔官网,可以在上面找到对应系统镜像的安装脚本:https://www.bt.cn/download/linux.html 如果你和我一样使用Ubuntu,直接执行以下命令吧: 1 wget -O install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh 执行完成后在服务器上执行bt来配置用户名和密码。 执行/etc/init.d/bt default查看面板入口,一般是你的ip:8888/xxxxxx的形式并访问,用上一步设置的用户名密码登录。 基于Flask的api编写 初始化Flask API 1 2 3 4 from flask import Flask from flask_restful import Resource, Api, reqparse app = Flask(__name__) api = Api(app) 创建端点 假设我们最后的API结果位于网站http://www.

线性代数与空间解析几何 女娲补天复习笔记

矩阵及其初等变换 概念 同型矩阵:A与B都是m*n矩阵,则称A与B是同型矩阵。 负矩阵:A的每个元换成它的相反数,记为-A 数量矩阵:$kI,k∈R$ 反称矩阵:$A^T=-A$ Conclusions $(AB)^T=B^TA^T$ $(AB)^{-1}=B^{-1}A^{-1}$ AB为对称矩阵$\iff AB=BA$ 行初等变换左乘初等矩阵,列初等变换右乘。 $(A^T)^{-1}=(A^{-1})^T$ 行列式 Conclusions 若行列式某两行对应元成比例, 行列式为零。 $|A^{-1}|=\frac{1}{|A|}$ $|A^{\star}|=|A|^{n-1}$ 范德蒙德行列式结论:$\prod_{1≤j<i<n}(x_i-x_j)$ $A^{\star}A=|A|I$ A可逆$\iff R(A)=n \iff AX=0$只有零解$\iff AX=b$有唯一解 $R(A)=R(B) \iff $ A与B等价(A与B是同型矩阵) 几何空间 概念 自由向量:不考虑起点的向量 方向角:向量与坐标轴的夹角 方向余弦:方向角的余弦 平面束:经过直线$l$的全体平面称为过$l$的平面束 Conclusions $Prj_u(\vec{a}+\vec{b})=Prj_u\vec{a}+Prj_u\vec{b}$ $[\vec{a}\ \vec{b}\ \vec{c}]=0 \iff \vec{a}\ \vec{b}\ \vec{c}$共面 n维向量空间 概念 子空间:设$V$是$R^n$的一个非空子集合,则$V$是$R^n$的一个子空间的充分必要条件是$V$对于$R^n$的加法和数乘运算是封闭的。 所有向量$\vec{a_1}\ \vec{a_2}\ \vec{a_3}\ … \vec{a_n}$线性组合的集合用$L(\vec{a_1},\vec{a_2},…,\vec{a_n})$表示。 只含零向量的向量组的秩为0。 Conclusions $A=(\vec{a_1},\vec{a_2},…,\vec{a_n})$,则$\vec{a_1},\vec{a_2},…,\vec{a_n}$线性相关$\iff AX=0$有非零解$\iff R(A)<n\iff |A|=0$ $R(AB)≤min{R(A),R(B)}$ $R(A+B)≤R(A)+R(B)$ $max{R(A),R(B)}R[(A,B)]≤R(A)+R(B)$ $AX=0$的基础解系所含解向量个数为$n-R(A)$ $R(A)=n-1$则$R(A^{\star})=1$ 特征值与特征向量 概念 特征子空间:对于特征值$\lambda$的所有特征向量构成的子空间。 Conclusions $\lambda$是$A$的一个特征值,则$\frac{1}{\lambda}$是$A^{-1}$的一个特征值,特征向量相同。

使用Nonebot2和Gocq搭建QQ机器人并部署到服务器

配置机器人 QQ机器人的基本架构 这里引用一个看到过的例子: 在一个餐馆中,你点了一盘菜。此时会发生什么事情呢? 1、服务员接受你点的菜 2、服务员把你点的菜告诉大厨 3、大厨进行一个烹饪 4、服务员把菜端到你桌上 在一个QQ机器人中,go-cqhttp就类似于一个服务员,负责接收消息、把消息传达给nonebot2、发送消息。而nonebot2 就相当于一个大厨,负责“思考”对消息该做出什么反应。 那么go-cqhttp如何将消息传达给nonebot2呢? 这里我们使用的是反向websocket连接:go-cqhttp会主动寻找nonebot2的程序,并将消息通过websocket推送给nonebot2。当然,如果你只是想要做出一个QQ机器人,你可以不需要深入了解该通信方式。 准备 我们需要:一个云服务器,nonebot2,go-cqhttp 由于nonebot2是基于python3.7+的,所以我们还需要配置一个python。 我推荐在服务器上执行命令前先使用sudo -i切换到管理员账户来避免一些麻烦 安装系统镜像&python 首先你需要一个云服务器,并安装系统镜像。我这里选用的是Ubuntu20.07系统镜像,因为Ubuntu20.07自带一个Python3.8.10,可以省去python的配置步骤。 这一步按理来说是可以一键完成的,起码腾讯云和阿里云都有一键安装的入口。 安装nonebot2 执行以下命令: 1 2 pip3 install nb-cli pip3 install nonebot-adapter-cqhttp 如果找不到库的话,可以试试换源: 1 2 pip3 install nb-cli -i https://pypi.org/simple pip3 install nonebot-adapter-cqhttp -i https://pypi.org/simple 安装go-cqhttp 下载go-cqhttp 在go-cqhttp的Release页面找到go-cqhttp_linux_386.tar.gz并下载。 或者直接点击这里下载。 这里下载的是适用于Linux的32位go-cqhttp,如果你是64位,请找到并下载go-cqhttp_linux_amd64.tar.gz 将go-cqhttp上传至服务器 这里使用宝塔Linux面板辅助上传。宝塔yyds。 这是宝塔官网,可以在上面找到对应系统镜像的安装脚本:https://www.bt.cn/download/linux.html 如果你和我一样使用Ubuntu,直接执行以下命令吧: 1 wget -O install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh 执行完成后在服务器上执行bt来配置用户名和密码。

Go语言乱学速成学习笔记

本文基于C++、python语言基础学习. 基本 示例 1 2 3 4 5 package main import "fmt" func main() { fmt.Println("Hello, World!") } 1、当标识符(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Group1,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的 public);标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的(像面向对象语言中的 protected ) 2、大括号不准换行,一行代表一个语句结束,没有分号。 3、标识符、注释规则与cpp相同。 4、变量类型:数字、字符串、布尔。 语法相关 变量相关 变量声明 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 //var v_name type //Example: var a string = "ABCD" var b, c int = 1, 2 //var v_name //Example: var d int // 初始值为0 var e string //初始值为"" //var v_name = value var f = true var g = 0 //自动判断变量类型 // v_name = value intVal := 1 //相当于: var intVal int intVal = 1 //这种结构只能在函数体中出现。 /*var( v_name1 type1 v_name2 type2 )*/ //Example: var ( a int b bool ) 函数内变量不允许声明但不使用