Hackergame 2020
字数 1853 2025-08-24 10:10:13
Hackergame 2020 解题教学文档
1. 签到题
题目描述:通过网页滑杆提交数值获取flag
关键点:
- 滑杆提交0会成功但没有flag
- 系统要求提交正整数
- 前端JavaScript阻止滑杆停留在1
解决方法:
-
URL参数修改法:
- 直接修改URL参数:
http://202.38.93.111:10000/?number=1
- 直接修改URL参数:
-
开发者工具控制法:
- 打开Chrome开发者工具(F12)
- 在Console标签输入:
$('#number')[0].value = 1; - 点击提交按钮
-
前端代码分析:
- JavaScript代码会检测value=1的情况并自动修改为1.00001或0.99999
- 直接设置value=1可以绕过这个检测
2. 游戏胜利获取flag
题目描述:通过游戏胜利逻辑获取flag
关键点:
- 网页源代码中有提示:
<!-- changelog: - 2020/10/31 getflxg @ static/js/html_actuator.js --> - 游戏胜利时会访问特定URL:
/getflxg?my_favorite_fruit=+ 特定值
解决方法:
-
分析JavaScript代码:
- 胜利时访问的URL包含:
('b'+'a'+ +'a'+'a').toLowerCase() - 在Console执行该表达式得到"banana"
- 胜利时访问的URL包含:
-
直接构造URL:
- 访问:
/getflxg?my_favorite_fruit=banana
- 访问:
技术细节:
- JavaScript表达式
('b'+'a'+ +'a'+'a').toLowerCase()的运算过程:+'a'尝试将'a'转为数字得到NaN- 字符串连接后得到"baNaNa"
- toLowerCase()后变为"banana"
3. 一闪而过的flag
题目描述:运行提供的exe文件获取flag
解决方法:
- 直接运行exe文件:
- 在命令行中执行下载的exe文件
- 程序会直接输出flag
4. 从零开始的记账工具人
题目描述:处理中文数字表示的账单金额
关键点:
- 需要将中文数字(如"壹佰贰拾叁元肆角伍分")转换为数字(123.45)
- 需要处理元、角、分单位
解决方法:
-
手工计算法:
- 将中文数字替换为阿拉伯数字
- 将单位替换为数学运算符号:
- '拾' -> '*10+'
- '佰' -> '*100+'
- '仟' -> '*1000+'
- '元' -> ''
- '角' -> '/10+'
- '分' -> '/100'
-
Python编程法:
import cn2an lines = open('bills.csv').readlines()[1:] s = 0 for line in lines: a, b = line.strip().split(',') n = 0 if '元' in a: y, a = a.split('元') n += cn2an.cn2an(y, "smart") if '角' in a: y, a = a.split('角') n += cn2an.cn2an(y, "smart") / 10 if '分' in a: y, a = a.split('分') n += cn2an.cn2an(y, "smart") / 100 s += n * int(b) print(s)
5. 超简单的世界模拟器
题目描述:通过生命游戏规则消除特定位置的方块
关键点:
- 需要了解生命游戏(Conway's Game of Life)规则
- 需要构造初始状态来消除目标方块
解决方法:
-
手工构造法:
- 对于第一个方块,使用水平移动的"太空船"模式:
000000000000000001111000000000010001000000000000001000000000010010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - 对于第二个方块,使用会扩散的初始状态:
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011000000000000001100000000000011000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000
- 对于第一个方块,使用水平移动的"太空船"模式:
-
暴力搜索法:
- 随机生成初始状态
- 模拟生命游戏演化
- 检查是否消除目标方块
6. 从零开始的火星文生活
题目描述:处理编码转换问题
解决方法:
- 使用文本编辑器进行多次编码转换:
- UTF-8 -> GBK
- GBK -> UTF-8
- UTF-8 -> ISO8859-1
- ISO8859-1 -> GBK
7. 自复读的复读机
题目描述:编写能输出自身代码的Quine程序
关键点:
- 第一问:输出自身代码的逆序
- 第二问:输出自身代码的SHA256哈希值
解决方法:
-
第一问答案:
exec(s:='print(("exec(s:=%r)"%s)[::-1],end="")')或
s='s=%r;print((s%%s)[::-1],end="")';print((s%s)[::-1],end="") -
第二问答案:
exec(s:='print(__import__("hashlib").sha256(("exec(s:=%r)"%s).encode()).hexdigest(),end="")')或
import hashlib;s='import hashlib;s=%r;print(hashlib.sha256((s%%s).encode()).hexdigest(),end="")';print(hashlib.sha256((s%s).encode()).hexdigest(),end="")
8. 233同学的字符串工具
字符串大写工具
题目描述:输入一个字符串,其字面不是"flag"但大写后是"FLAG"
解决方法:
- 使用Unicode连字"fl"(U+FB02)
- 输入"flag":
- 字面上不是"flag"
- 转换为大写后变成"FLAG"
UTF-7转换工具
题目描述:输入一个字符串,其字面不是"flag"但从UTF-7转换为UTF-8后是"flag"
解决方法:
- 了解UTF-7编码规则
- 构造"flag"的替代UTF-7编码:
- 'f'的UTF-7编码:+AGY-
- 完整构造:+AGY-lag
技术细节:
- UTF-7编码过程:
- 字符'f'的Unicode码位:0x66
- 16位二进制:00000000 01100110
- 重新分组:000000 000110 011000
- Base64编码:A G Y
- 结果:+AGY-