浙江省2022省赛write up
久违的题解来啦!!!
沙耶之歌战队
- 解题过程中,关键步骤不可省略,不可含糊其辞、一笔带过。
- 解题过程中如是自己编写的脚本,不可省略,不可截图(代码字体可以调小;而如果代码太 长,则贴关键代码函数)。
- 您队伍所有解出的题目都必须书写WRITEUP,缺少一个则视该WRITEUP无效,队伍成绩将无 效。
- WRITEUP如过于简略和敷衍,导致无法形成逻辑链条推断出战队对题目有分析和解决的能 力,该WRITEUP可能被视为无效,队伍成绩将无效。
- 提交PDF版本即可
战队信息
- 战队名:沙耶之歌
- 排名:3
解题情况

所有题目的附件👇
Web
babysql
sqlmap一把梭,用个space2mssqlhash tamper即可。
ezphp
7.1.0 | 内置的随机数产生算法从 libc rand 函数改成 » 梅森旋转伪随机数生成算法。 |
---|
所以可以爆破。
1 | <?php |
然后burpsuite跑一下即可。
这题没权限写马,浪费了很多时间,可惜。
所以总结一下:一般情况下,非文件上传功能的目录都是不给 w 权限的,所以能执行命令就不要写🐎
PWN
pwn3
题目分析(赛后复现的赛中分析)
静态链接的 elf,逻辑比较难以分析,不过根据题目的描述选择直接 down 下来跑一下看看。

发现是一个迷宫,用 wsad 上下左右移动,结果显而易见,走到出口之后打印了我们一个 flag 字符串,其它什么都没有给,但是貌似最后还有一个输入,考虑一下栈溢出,输入大量数据来确定。
为了方便调试还是选择用脚本跑掉前面的内容。
1 | from pwn import * |
结束之后输入大量的 a 发现 0x4017cc 的返回指令返回到 0x6171717171717171,说明我们写的 a 覆盖到了返回地址,这里我们就能劫持程序流了。

反复跑脚本确定了缓冲区大小是 0x178,我们需要在 0x180 之后输入返回地址劫持。由于是静态链接,静态链接中能找到调用的 execve 函数,直接使用 gadget 调用结束。在静态链接中,想要准确的找到函数的位置基本是挺难的,但是 execve 还是比较好找的,我们直接搜 /bin/sh 字符串,然后交叉引用就能看到。

就是图中 0x5cd630 函数。
然后我们补一下脚本,这里为了方便调试,我们直接把断点打在返回指令的地址。
1 | from pwn import * |
当我以为成功的时候

发现 shell 并没有用,于是才发现这题开了沙箱保护,禁用了 execve 系统调用,因此我们的提权计划宣告失败。
那我们只能选择 orw 去读出 flag,但是当把所有的 gadget 找齐拼接好以后发现他溢出长度还有限制。
于是这个时候我只能选择栈迁移,不过栈迁移之前需要在一个确定可读可写的位置写上 rop 链才能达到目的。
这里还需要一个最终的 gadget:pop rdx ; pop rsi ; ret。不然发现长度还是不够,而我最终的 exp 则是刚刚好利用完所有的空间,这里还省了一个 pop rax ; ret,因为它程序运行到这里就直接 rax=0 了,所以这里可以省下 17 字节。
exp
1 | from pwn import * |
运行结果
赛时截图:

不管怎么说,这题拿到了一个一血,还是很开心的,但是据说这题有更简单的做法,因为程序运行的时候会分配一个可读可写可执行的段,而我们可以利用这个段写 shellcode 去得到 flag,而 pwntools 自带构造 shellcode 的函数,可以让我们方便去构造 shellcode。
Re
zandroid
zip打开,找资源文件发现直接 flag 在 mipmap-xxxhpdi-v4 下面有一个 pic1.png 上面画着 flag。
我的 re 什么时候才能站起来啊,听说这次 re 异常简单,而我就是不会。
Crypto
rssssa5
用sagemath跑下面的脚本
1 | import gmpy2 |

然后解下hex即可
1 | DASCTF{ce73935b2e83a78aa5079a9e59ae4980} |
math
思路大概就是对每一个操作求逆,直接跑个脚本完事
1 | from Crypto.Util.number import * |

MISC
checkin_gift
拿到发现是两张图片整合而成的,分离图片时发现中间有一串gift,刚开始以为是base64,怎么试都还是错的,后来才发现不是,最后拿去解码拿到flag


m4a
拿到一个没有后缀的文件

拖入010发现文件末尾有疑似压缩包关键字

但是好像是倒着的,用瑞士军刀倒回来

保存下来准备打开,但是显示损坏

用WinRAR修复一下得到一个完整的压缩包


但是发现解压需要密码,爆破无果,看了一会别的题目回到这个题的时候,发现题目一直在强调m4a的文件类型,在010中反复查看,突然注意到开头的mp,发现文件中有好多个m和p字母出现

因为没有很明显的文件头和文件尾,脑洞一开猜想会不会是mp3或者mp4,于是改了个文件尾,发现可以打开(打开的一瞬间吓我一跳、、)

正经人当然纯靠耳朵听摩斯密码啦(bushi
打开Au一顿操作猛如虎

翻译一下

解码一下

拿到压缩包密码,打开压缩包

拿到一串字符,交了一下发现错误,文件名是atbash,在瑞士军刀中搜索发现有此方法,拖入后将得到的字符上交,还是错误。
试了一下签到题里用过的rot13,还是错误,只能将解密库里的解密一个一个试过去,发现居然是47、、(远在天边近在眼前

提交得到flag
Unkn0wnData
拿到一张图片打开核对文件头文件尾发现尾端多出一部分

把尾端多出来的部分拿去解密
用base64解密后只能看到前面部分,后面依旧是乱码,但是很有规律,结合做题经验发现是我最讨厌的表情符号

然后拿key
用Stegsolve解码下图片
504B,明显zip文件


处理下文件
1 | f=open('./key.txt','r') |
发现是键盘流量,但是格式不太对,写个脚本添加冒号,核对格式后直接套用大佬的脚本

1 | normalKeys = {"04": "a", "05": "b", "06": "c", "07": "d", "08": "e", "09": "f", "0a": "g", "0b": "h", "0c": "i", |
解密

提交