xyb-WP
祥云杯自杀式打比赛。
基本信息
战队名称:HASH-TEAM
所属单位:山东大学
排名:总58,高校组31
攻克题目
web
Secrets_Of_Admin
安全检测
PWN
note
misc
鸣雏恋
考古
ChieftainsSecret
cry
myRSA
Guess
Random_RSA
re
勒索解密
Rev_Dizzy
WP
先放队友的
web
Secrets_Of_Admin
content的过滤可抓包后用数组绕过,经试验发现pdf会执行<script>标签中的代码,再结合api/files这个路由的功能便可实现ssrf。
在/api/files/:id路由中,不能访问username为superuser的列的内容,但flag写入在其中,考虑到我们访问它的时候token.username是admin,可以通过ssrf将flag写入admin的filename中,但这里因为filename列开启了UNIQUE属性,所以不能直接写flag,所以写入../files/flag即可。
1 | content[]=<script>location.href="http://127.0.0.1:8888/api/files?username=admin&file=../files/flag&checksec=aaa"</script> |
注意url编码。
安全检测
登录进入后发现存在SSRF 扫目录发现存在/admin目录,直接进入会403 利用SSRF检测http://127.0.0.1/admin发现存在目录泄漏 /admin下存在include123.php直接访问仍然是403,于是利用SSRF访问
1 | <?php |
很多东西都被ban了,似乎只能用作普通包含,立刻可以想到session文件投毒 利用以下脚本,并不断申请检测 http://127.0.0.1/admin/include123.php?u=/tmp/sess_slug01sh 多试几次就能靠竞争拿到flag(之所以知道是/getflag.sh是因为之前还竞争了一次运行了system("find / -name *flag*"),找到了flag位置)
1 | import requests |
PWN
note
2.23保护全开
add
添加一个0x100内的堆块,会告知该堆块地址。指针存在bss段。(没用到)
say
往栈区buf写0x64字节,然后作为scanf的参数,这里可以输入形如%10%p格式的值作为参数,配合溢出控制栈中参数,引入任意地址写。
show
打印bss段存的指针指向的堆块内容。(没用到)
这题add和show都没使用到,也不知道怎么用。先用了格式化字符串的任意写修改_IO_2_1_stdout的flag和read_base,得到libc基址。然后再用格式化字符串修改栈中的内容,栈喷射填入one_gadget,最后在末尾添加""字符,就好了。
1 | from pwn import * |
附exp:
1 | from pwn import * |
misc
鸣雏恋
附件为鸣雏恋.docx,大小 65 MB ,打开后发现只有 7 个字,全选没隐藏元素,故内容肯定有隐写了啥,不然没这么大。
后缀 docx 改 zip 直接解压,在 _rels 文件夹下发现 key.txt 和带密码的压缩包 love.zip 。
观察 key.txt ,发现字数与实际不符,010editor 也可查看到字间有很多未显示字符。
在 http://330k.github.io/misc_tools/unicode_steganography.html 零宽字符解密得压缩包密码
Because I like naruto best
解压 love.zip
129488 个图,解压时吓到我了
观察后发现总共只出现了两种图,同种图内容无差异,联想到是否是01序列字符串,写脚本
1 | import os |
得到 01 字符串,扔进 Cyberchef 转16进制得一张 base64 编码的图片,解码后得到 flag(图片真的好糊)
考古
附件名 memory ,判断为内存镜像,使用 volatility 进行分析
cmdscan得到提示,判断 Oneclickcleanup.exe 应该是恶意软件,为解题关键
filescan | grep Oneclickcleanup 得到地址
dumpfile 得到 Oneclickcleanup.exe
之后陷入了一段时间的困境,主要是找不到合适的虚拟机和re手不理我,使用winXPSP2运行该程序该程序会打印 10 行 Hacked by 1cePack!!!!!!! 然后程序崩溃
re手看了一眼,告诉我异或一下恢复了一个 f14g.dot ,里头写着 此处无flag三百两 ,怼了一会之后想起re说的异或,拿去cyberchef爆破了一下 xor brute force 就爆出flag了
接下来是我的
ps.我就是那个被当成逆向手用的密码手,准确来说逆完得到的是一个data数据,丢进DIE发现是MS word,再加上ida打开读二进制能看到MS的文件,所以改后缀doc直接打开,但尝试改其他几个提到的名称没啥作用,就想着是不是有其他的加密。再加上老旧电脑,容易想到比特翻转啥的,就试了试cyberchef的爆破异或,拿到flag.
ChieftainsSecret
打开发现是个老旧电话机,binwalk+foremost分解出来一个rar
解rar得到一张电路图和一份数据。csv数据转xlsx。
直接作图结合电路图可以猜到是提供正余弦波返回角度,通过角度恢复号码
量了量发现基本上每个按键都是22.5度,所以直接反三角函数得到线性关系再凑整。
一番操作后得到下图

当晚失败。
起来读了读数据发现其实没到上界,于是把之前按照头的方式改成按照尾的方式试一下,即
66974851346 77085962457
试了试,得到了flag
cry
提前声明,由于本人虚拟机第二天崩了,导致第一天的三个密码脚本只剩一个guess,所以后两个题重做,与原数据会有出入。
myrsa
这个题核心就化式子。
观察题目,发现给了最多15次加密给定明文的机会,并通过功能2得到同种加密的flag
取RSA的结果为c,返回值为C,则\(C=[(p+q)^3-(p+q)^2+(p+q)+4n]\cdot c+randk\)
那这个题核心就变成构造式子化式子。
取rsa不动点m=c=1,\(C=(p+q)^3-(p+q)^2+(p+q)+4n+randk\),
注意到p+q在513bit数量级上,而虽然\(4n-(p+q)^2<0\)但randk数量级更大,所以整体数量级就会有\(C>(p+q)^3\)
另一方面randk数量级1040左右,将其在数量级上与(p+q)约等,有\(C<(p+q)^3+2^{14}(p+q)^2<(p+q+\frac{2^{14}}{3})^3\)
可爆破\(p+q<\sqrt [3]{C}<p+q+\frac{2^{14}}{3}\),通过\((p+q)^2-4n=(p-q)^2\)验证验证整除性分解出pq,进而解决问题。
对于随机数,要不通过整除性和开根性把随机数去掉,要不增加额外信息把随机数消去,这里发现c的系数远大于randk,直接整除消去即可。
抓数据的时候需要传入b"\0x1"所以重做魔改了guess的脚本传参。
抓数据的脚本(具体脚本guess中再说明):
1 | from pwn import * |
解题exp:
1 | from Crypto.Util.number import * |
guess
先提供一次解密机,再对提供的参数做加密,判断加密的key是奇数位(1)还是偶数位(0),再提供一次解密机,但不能解密上次的明文,最后输入0,1,验证32次即成功。
想到是同态加密,一查发现的确是同态算法,有ci*cj=mi+mj,至此问题解决。
构造以下过程
1 | send c1,recv m1 |
在key.sage中发现key只有80个,且为静态的,上界1000,下界100
用dic数组爆破
脚本如下
(因为写好了过sha的脚本,所以直接用进程间通信写的)会有以下两个文件pysha.sh。
1 |
|
sha.py
1 | from hashlib import sha256 |
主体:
1 |
|
random RSA
发现是个带随机数生成的dp泄露,通过给的数据确定出是py2下的MT算法,于是得到dp
1 | #py2 |
然后就dp泄露一把梭
1 | dp = 5372007426161196154405640504110736659190183194052966723076041266610893158678092845450232508793279585163304918807656946147575280063208168816457346755227057 |
re
勒索解密
发现用了密码学固件,【密码人支楞起来了】,再结合题干提到的漏洞,猜测是密码学固件滥用。
从固件往下分析,发现有一个函数用了大量的固件,于是戳进去动调。
动调的时候需要过一个校验,满足v7<=0x100000.
可以注意到关键函数用了一个hash,查询api发现是sha256
然后可以直接读到hash前的数据为B2 2F C6 0E 4F D4 54 4B 00 00 00 00 21 E7 B1 8E,空位补时间戳。
翻压缩包拿到加密时间,在线查了下时间戳为1629098245,转小端 塞进去05 11 a1 61
(长久不做逆向大小端转换都忘了,被卡了一上午)
过sha256后输出前16字节,然后16字节密钥。
猜是AES,查了密码接口果然是AES128,api文档说了默认加密CBC,iv=0
参数齐活,拿去写脚本,解密得到
1 | from hashlib import sha256 |
rev_Dizzy
最开始打开题目人都懵了,没法f5玩个der【不是】,后来仔细看了看代码结构,发现好像是+=这类的模式,不是方程组,就可以直接逆过程,于是通过重置函数手动e,p反复拆成了多个小函数,反汇编之后拿到C代码,于是翻转行,加减交换,再把最终结果放进去,得到答案。
脚本不放了,5000+行未免有些多,放个截图。
