Hackergame 2020
字数 1853 2025-08-24 10:10:13

Hackergame 2020 解题教学文档

1. 签到题

题目描述:通过网页滑杆提交数值获取flag

关键点

  1. 滑杆提交0会成功但没有flag
  2. 系统要求提交正整数
  3. 前端JavaScript阻止滑杆停留在1

解决方法

  1. URL参数修改法

    • 直接修改URL参数:http://202.38.93.111:10000/?number=1
  2. 开发者工具控制法

    • 打开Chrome开发者工具(F12)
    • 在Console标签输入:$('#number')[0].value = 1;
    • 点击提交按钮
  3. 前端代码分析

    • JavaScript代码会检测value=1的情况并自动修改为1.00001或0.99999
    • 直接设置value=1可以绕过这个检测

2. 游戏胜利获取flag

题目描述:通过游戏胜利逻辑获取flag

关键点

  1. 网页源代码中有提示:<!-- changelog: - 2020/10/31 getflxg @ static/js/html_actuator.js -->
  2. 游戏胜利时会访问特定URL:/getflxg?my_favorite_fruit= + 特定值

解决方法

  1. 分析JavaScript代码:

    • 胜利时访问的URL包含:('b'+'a'+ +'a'+'a').toLowerCase()
    • 在Console执行该表达式得到"banana"
  2. 直接构造URL:

    • 访问:/getflxg?my_favorite_fruit=banana

技术细节

  • JavaScript表达式('b'+'a'+ +'a'+'a').toLowerCase()的运算过程:
    • +'a'尝试将'a'转为数字得到NaN
    • 字符串连接后得到"baNaNa"
    • toLowerCase()后变为"banana"

3. 一闪而过的flag

题目描述:运行提供的exe文件获取flag

解决方法

  1. 直接运行exe文件:
    • 在命令行中执行下载的exe文件
    • 程序会直接输出flag

4. 从零开始的记账工具人

题目描述:处理中文数字表示的账单金额

关键点

  1. 需要将中文数字(如"壹佰贰拾叁元肆角伍分")转换为数字(123.45)
  2. 需要处理元、角、分单位

解决方法

  1. 手工计算法

    • 将中文数字替换为阿拉伯数字
    • 将单位替换为数学运算符号:
      • '拾' -> '*10+'
      • '佰' -> '*100+'
      • '仟' -> '*1000+'
      • '元' -> ''
      • '角' -> '/10+'
      • '分' -> '/100'
  2. 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. 超简单的世界模拟器

题目描述:通过生命游戏规则消除特定位置的方块

关键点

  1. 需要了解生命游戏(Conway's Game of Life)规则
  2. 需要构造初始状态来消除目标方块

解决方法

  1. 手工构造法

    • 对于第一个方块,使用水平移动的"太空船"模式:
      000000000000000001111000000000010001000000000000001000000000010010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
      
    • 对于第二个方块,使用会扩散的初始状态:
      000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011000000000000001100000000000011000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000
      
  2. 暴力搜索法

    • 随机生成初始状态
    • 模拟生命游戏演化
    • 检查是否消除目标方块

6. 从零开始的火星文生活

题目描述:处理编码转换问题

解决方法

  1. 使用文本编辑器进行多次编码转换:
    • UTF-8 -> GBK
    • GBK -> UTF-8
    • UTF-8 -> ISO8859-1
    • ISO8859-1 -> GBK

7. 自复读的复读机

题目描述:编写能输出自身代码的Quine程序

关键点

  1. 第一问:输出自身代码的逆序
  2. 第二问:输出自身代码的SHA256哈希值

解决方法

  1. 第一问答案

    exec(s:='print(("exec(s:=%r)"%s)[::-1],end="")')
    

    s='s=%r;print((s%%s)[::-1],end="")';print((s%s)[::-1],end="")
    
  2. 第二问答案

    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"

解决方法

  1. 了解UTF-7编码规则
  2. 构造"flag"的替代UTF-7编码:
    • 'f'的UTF-7编码:+AGY-
    • 完整构造:+AGY-lag

技术细节

  • UTF-7编码过程:
    1. 字符'f'的Unicode码位:0x66
    2. 16位二进制:00000000 01100110
    3. 重新分组:000000 000110 011000
    4. Base64编码:A G Y
    5. 结果:+AGY-
Hackergame 2020 解题教学文档 1. 签到题 题目描述 :通过网页滑杆提交数值获取flag 关键点 : 滑杆提交0会成功但没有flag 系统要求提交正整数 前端JavaScript阻止滑杆停留在1 解决方法 : URL参数修改法 : 直接修改URL参数: http://202.38.93.111:10000/?number=1 开发者工具控制法 : 打开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: 访问: /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编程法 : 5. 超简单的世界模拟器 题目描述 :通过生命游戏规则消除特定位置的方块 关键点 : 需要了解生命游戏(Conway's Game of Life)规则 需要构造初始状态来消除目标方块 解决方法 : 手工构造法 : 对于第一个方块,使用水平移动的"太空船"模式: 对于第二个方块,使用会扩散的初始状态: 暴力搜索法 : 随机生成初始状态 模拟生命游戏演化 检查是否消除目标方块 6. 从零开始的火星文生活 题目描述 :处理编码转换问题 解决方法 : 使用文本编辑器进行多次编码转换: UTF-8 -> GBK GBK -> UTF-8 UTF-8 -> ISO8859-1 ISO8859-1 -> GBK 7. 自复读的复读机 题目描述 :编写能输出自身代码的Quine程序 关键点 : 第一问:输出自身代码的逆序 第二问:输出自身代码的SHA256哈希值 解决方法 : 第一问答案 : 或 第二问答案 : 或 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-