简易前端 我们先随便写一个简单的前端页面,放在工作目录下./templates文件夹中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <form action="http://47.108.140.140:8080/loginform" method="post"> 用户名:<input type="text" name="username" placeholder="请输入你的用户名"> <br> 密 码:<input type="password" name="password" placeholder="请输入你的密码"> <br> <input type="submit" value="登录"> </form> <p> ============OR============= </p> <form action="http://47.108.140.140:8080/registerform" method="post"> 用户名:<input type="text" name="username" placeholder="请输入你的用户名"> <br> 密 码:<input type="password" name="password" placeholder="请输入你的密码"> <br> <input type="submit" value="注册"> </form> </body> </html> 由于不是重点,这里不详细介绍前端功能
Tarjan&Topo 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 void tarjan(int u) { dfn[u] = low[u] = ++tim; ins[u] = 1; stac[++top] = u; for(int v, i = h[u]; ~i; i = e[i].next) if(!dfn[(v = e[i].to)]) { tarjan(v); low[u] = min(low[u], low[v]); } else if(ins[v]) low[u] = min(low[u], low[v]); if(low[u] == dfn[u]) { int y; while(y = stac[top--]) { sd[y] = u; ins[y] = 0; if(u == y) break; p[u] += p[y]; } } } void topo() { queue <int> q; for(int i = 1; i <= n; ++i) if(sd[i] == i && !
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:
整体架构 (图源网络)
其中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}$的一个特征值,特征向量相同。