BaseCTF2024
Web
玩原神玩的
1 |
|
首先第一部分
1 | if (sizeof($_POST['len']) == sizeof($array)) { |
需要POST传参len,并且长度需要是array数组的长度,所以这里决定向服务器传递一组连续的参数值,以len[0]=1&len[1]=1&len[2]=1&...的结构向len数组传入值,使数组中的值数量增加,从而爆破array数组的长度,这里使用一个python脚本,来写一个密码本
1 | s = "" |
得到的密码本像这样
1 | len[1]=1 |
然后使用burpsuite抓包,在POST参数处用上面的密码本进行爆破,为了验证是否通过,还需要在GET参数处传入tip = 我要玩原神,进行爆破。
1 | function ys_open($tip) { |
爆破得到的数据包都是一样的长度,所以需要逐一查看,看数据响应包中回显我不管,我要玩原神,则证明已经进入ys_open函数,这里爆破出来,len为45,也就是len[0]=1&len[1]=1&len[2]=1&...&len[45]=1。
第二部分
1 | function dumpFlag() { |
['m'][0]这里以这样的形式赋值,证明m是一个数组。题目有判断m是否存在以及长度是否为2。
这里使用||(或运算)意味着需要都不满足才能不die,有一个满足就会die,a传入100%,b传入love100%再拼接一个a的md5值,但是需要注意这里的%需要先进行URL编码,不然会被浏览器解析不能绕过
1 | m[0]=100%25&m[1]=love%255e2d121ec0059bcf0ebb8e6ecc0fb3c1 |
第三部分
1 | $flag[] = array(); |
输入m数组值后,返回一连串的md5的列表值,如下
1 | ["3295c76acbf4caaed33c36b1b5fc2cb1","26657d5ff9020d2abefe558796b99584",……] |
这些数组是第三部分中,对flag数组的加密逻辑之后的结果
加密逻辑分解
ord($array[$ii])
获取数组$array中第$ii个字符的 ASCII 码值(如字符'A'→65)。^ $ii
对 ASCII 码进行 按位异或(XOR) 操作,异或的密钥是当前索引$ii。md5(...)
将 XOR 结果转换为 32 位 MD5 哈希值。
这里写一个解密的脚本
1 | import hashlib |
- 对每个哈希值,暴力破解
0-255的数字,找到MD5匹配的数字i。 - 用
i ^ 当前索引 ii逆向计算原始字符的ASCII码
最终就可以直接输出flag
其中核心的代码如下:
1 if hashlib.md5(str(i).encode()).hexdigest() == flag:
str(i)
- 将数字
i转换为字符串(如65→"65")。- 为什么? MD5 算法需要字节输入,而非直接的数字。
.encode()
- 将字符串编码为字节(默认 UTF-8)。
- 例如:
"65"→b'65'(字节形式)。hashlib.md5()
- 调用 Python 的 MD5 哈希算法,生成哈希对象。
- 输入:字节流(如
b'65')。.hexdigest()
- 将 MD5 哈希结果转换为 32 位十六进制字符串。
- 例如:
b'65'的 MD5 →"7fc56270e7a70fa81a5935b72eacbe29"。== flag
- 比较生成的哈希值与目标
flag是否一致。完整执行流程示例
假设
i = 65,flag = "7fc56270e7a70fa81a5935b72eacbe29":
str(65)→"65""65".encode()→b'65'hashlib.md5(b'65')→ 哈希对象.hexdigest()→"7fc56270e7a70fa81a5935b72eacbe29"- 比较
"7fc56270..." == "7fc56270..."→True
其中
enumerate()是 Python 的一个内置函数,用于在遍历序列(如列表、元组、字符串)时,同时获取元素的索引和值。它将一个可迭代对象转换为一个“枚举对象”,生成(索引, 值)的组合。基本语法
1 enumerate(iterable, start=0)
- **
iterable**:要遍历的可迭代对象(如列表、字符串)。- **
start**(可选):索引的起始值(默认为 0)。核心功能
假设有一个列表
fruits = ['apple', 'banana', 'cherry']:
1
2 for index, value in enumerate(fruits):
print(index, value)输出:
1
2
3 0 apple
1 banana
2 cherry
Back to the future
拿到页面,第一反应是进行目录扫描,然后就扫出了很多文件,那么应该就不是这种方式,但是发现存在很多git目录下的文件

那么这题可能考察的git泄露,使用工具githacker
1 | githacker --url http://gz.imxbt.cn:20602/.git/ --output-folder ctf |
cmd打开生成的随机数的文件夹使用git log查看

可以看到有add what和remove flag
使用命令git diff + 版本commit,查看信息改动,获得flag
