3.Hackergame 2020

1.签到

url:http://202.38.93.111:10000/

打开签到题页面,拖动滑杆,如果将滑杆滑动到最左边,提交 0,那么我们会得到成功的返回,但是没有 flag

尝试手动提交一些非整数的值,发现得到返回信息:

我可以给你 1 个 flag、2 个 flag、3 个 flag…… 但我没法给你 0.34101个 flag。

返回信息提示我们要提交正整数的值,比如 1,而不是一个小数的值。

第一种方法

通过分析发现,这个滑杆的数值其实是通过浏览器地址栏中的一个参数来控制的,所以直接修改地址栏中的参数 number 的值为 1 即可,修改后回车即可得到 flag。

http://202.38.93.111:10000/?number=1

第二种方法

有的同学一定要把滑杆拖动到 1 才肯罢休,但即使是用键盘方向键操纵,最后数值也不会停留在 1。

分析前端页面,我们可以看到这么一段 JavaScript 代码:

var prevVal = 0;
$(document).ready(function() {$("#show").text($('#number')[0].value);$('#number').on('input', function() {if ($('#number')[0].value.toString() === "1") {console.log('没想到吧!');$('#number')[0].value = 1.00001;if (prevVal == 1.00001)  $('#number')[0].value = 0.99999;if (prevVal == 0.99999)  $('#number')[0].value = 1.00001;}$("#show").text($('#number')[0].value.toString());prevVal = $('#number')[0].value;});
});

其中 console.log(‘没想到吧!’); 所在的代码块就是判断在滑杆数值变动时是否为 1,如果为 1 就跳过的代码,所以我们无法手动拖动或键盘控制滑杆的值到 1。

但是我们可以直接参考这段代码,直接把滑杆的值设置为 1,具体来说,打开 Chrome 的开发者工具(F12),在 Console 标签下输入以下代码执行,即可将滑杆的值设置为 1,然后点击提交就可以得到 flag:

$(‘#number’)[0].value = 1;

点击提取

第三种方法

直接修改value的值为1

可以看到滑杆已停在1的位置,点击提取

第四种方法

将step设置为1

向右拖动滑杆即可到1的位置

2.2048

url:http://202.38.93.111:10005/

第一种方法

查看网页源代码,发现提示:

  <!-- changelog:- 2020/10/31 getflxg @ static/js/html_actuator.js-->

进而打开 static/js/html_actuator.js 这个文件,找到和游戏胜利有关的逻辑:

var url;if (won) {url = "/getflxg?my_favorite_fruit=" + ('b'+'a'+ +'a'+'a').toLowerCase();} else {url = "/getflxg?my_favorite_fruit=";}let request = new XMLHttpRequest();request.open('GET', url);

如果访问 /getflxg?my_favorite_fruit= 可以得到返回信息:

还没有大成功,不能给你 flxg。

这正是游戏失败时的提示信息。

我们打开 Chrome 浏览器的开发者工具,切换到 Console 标签页,执行一下 (‘b’+‘a’+ +‘a’+‘a’).toLowerCase(),得到正确的应该填入的值为 banana

访问 /getflxg?my_favorite_fruit=banana,则可以得到正确的 flag。

有的同学可能会好奇为什么 (‘b’+‘a’+ +‘a’+‘a’).toLowerCase() 的计算结果是 banana,这个问题可以参考:https://stackoverflow.com/questions/57456188/why-is-the-result-of-ba-a-a-tolowercase-banana 。

3.一闪而过的flag

首先下载题目中所给出的exe文件

打开cmd命令行窗口

将下载下来的exe文件拖到命令行窗口,点击回车运行即可得到flag

也可以在文件下载后的位置打开命令行窗口,直接运行exe文件

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

这道题考察选手基本的编程处理数据的能力,常见的编程语言都可以编写出解题代码。

解法 1

手工计算

解法 2

使用任意文本编辑器(或者 Excel 本身)做字符串替换,替换规则如下:

'零' -> ''
'壹' -> '1'
'贰' -> '2'
'叁' -> '3'
'肆' -> '4'
'伍' -> '5'
'陆' -> '6'
'柒' -> '7'
'捌' -> '8'
'玖' -> '9'
'拾' -> '*10+'
'佰' -> '*100+'
'仟' -> '*1000+'
'元' -> '+'
'角' -> '/10+'
'分' -> '/100'
'++' -> '+'
'整' -> ''

然后如果开头有乘号或者结尾有加号,去掉即可,这样的数学表达式求值即可得到正确的结果。

解法 3

编程求解,这里使用 Python 语言。

我们首先使用 Excel(或者其他商业的、开源的、在线的电子表格工具)将下载的文件转换为 .csv 格式,即逗号分隔的文本。(当然,你也可以使用解析 Excel 文件格式的库来处理)

然后在 Python 中安装 cn2an 这个中文数字转换的库:

python3 -m pip install cn2an

然后使用 Python 程序处理这个文件:

import cn2an
lines = open('bills.csv').readlines()[1:]
s = 0
for line in lines:a, b = line.strip().split(',')n = 0if '元' in a:y, a = a.split('元')n += cn2an.cn2an(y, "smart")if '角' in a:y, a = a.split('角')n += cn2an.cn2an(y, "smart") / 10if '分' in a:y, a = a.split('分')n += cn2an.cn2an(y, "smart") / 100s += n * int(b)
print(s)

5.超简单的世界模拟器

url:http://202.38.93.111:10010/

这道题手工构造与写代码暴力搜索都可以解决。

使用搜索引擎搜索“生命游戏”或“Game of Life”都可以找到很多相关的资料,其中会提到生命游戏的演化规则和一些有趣的构造。

手工构造解法

为了消除右上角的方块,我们只要放置一个水平移动的“太空船”即可:

000000000000000
001111000000000
010001000000000
000001000000000
010010000000000
000000000000000
000000000000000
000000000000000
000000000000000
000000000000000
000000000000000
000000000000000
000000000000000
000000000000000
000000000000000

这样可以得到第一个 flag。

消除第二个方块有点困难,因为(比较小的)飞行器只能沿着对角线方向和水平竖直方向飞行,我们的可控制区域比较小,无法让飞行器移动后与方块碰撞。

所以我们可以找一些会扩散比较大的初始状态,例如这个链接里面讲的例子。

一个可行的例子:

000000000000000
000000000000000
000000000000000
000000000000000
000000000000000
000000000000000
000000011000000
000000001100000
000000011000000
000000010000000
000000000000000
000000000000000
000000000000000
000000000000000
000000000000000

暴力解法

直接随机生成 0/1 矩阵,大概几十次就可以找到一个,Python 代码见solve.py

import randomMAP_SIZE = 50
CONTROL_SIZE = 15
STEP = 200
FLAGS = [(5, 45), (25, 45)]def flag_range(flag):x, y = flagfor i in range(2):for j in range(2):yield x + i, y + jclass Game:def __init__(self, W, H):self.W = Wself.H = Hself.map = [[0 for _ in range(W)] for _ in range(H)]for flag in FLAGS:for x, y in flag_range(flag):self.map[x][y] = 1def step(self):new = [[0 for _ in range(self.W)] for _ in range(self.H)]for i in range(self.H):for j in range(self.W):cnt = 0for io in -1, 0, 1:for jo in -1, 0, 1:if 0 <= i + io < self.H:if 0 <= j + jo < self.W:if io != 0 or jo != 0:if self.map[i + io][j + jo]:cnt += 1if cnt == 3:new[i][j] = 1elif cnt == 2:new[i][j] = self.map[i][j]else:new[i][j] = 0self.map = newrandom.seed(2020)
while True:game = Game(MAP_SIZE, MAP_SIZE)for i in range(CONTROL_SIZE):for j in range(CONTROL_SIZE):game.map[i][j] = random.randrange(2)s = ''for line in game.map[:CONTROL_SIZE]:for i in line[:CONTROL_SIZE]:s += str(i)s += '\n'last = game.mapfor i in range(STEP):game.step()if game.map == last:breaklast = game.mapcnt = 0for i, flag in enumerate(FLAGS):if all(not game.map[x][y] for x, y in flag_range(flag)):cnt += 1print("flags =", cnt)if cnt:print(s)

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

首先下载题目中所给出的文件

例如用 VSCode 的“Select Encoding”功能。

步骤(开始时 UTF-8 打开题目附件):

Save with Encoding -> GBK

Reopen with Encoding -> UTF-8

Save with Encoding -> ISO8859-1

Reopen with Encoding -> GBK

7.自复读的复读机

url:http://202.38.93.111:10050/

解题思路

使用搜索引擎搜索“输出自己的程序”或者类似的词,可以查到这类程序叫做 Quine。可以很容易在网上查到很多 Python 3 的 Quine,例如:

exec(s:=‘print(“exec(s:=%r)”%s)’)

还有

s=‘s=%r;print(s%%s)’;print(s%s)

等等。

这道题要求输出代码的逆序以及代码的哈希,我们可以修改上面的 Quine:

输出自己逆序的程序:exec(s:=‘print((“exec(s:=%r)”%s)[::-1])’)(把 print 的内容用括号括起来然后逆序即可)

但这样提交之后有一个问题,就是输出比代码多了一个 \n,这是由于输入的代码结尾没有换行符而 print 输出的内容结尾会自带换行符,我们只需要让 print 不输出换行符,加一个 ,end=“” 即可。

对于第二问,我们把 print 的内容用 Python 自带的计算 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="")')exec(s:='import hashlib;print(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="")

其他

要注意的是,这道题的程序是使用标准输入读入代码然后用 exec() 执行的,所以并不能使用 print(open(file).read()) 之类输出自己源代码文件的方案。

你可以使用 import os; os.system(‘ls’) 之类的代码来在服务器上任意执行命令,但是进程是以低权限运行的,这种方法不能读到 flag。

8.233 同学的字符串工具

url:http://202.38.93.111:10234/

「字符串大写工具」题解

代码的意思是:如果我们输入一个字面上不是 “flag” 但转换为大写后会变成 “FLAG” 的字符串,就可以得到 flag。

我们可以以 “unicode uppercase collision” 为关键字搜索,不难找到一个连字(ligature)

fl (0xFB02)

这个“字符”将在转换为大写时变成 FL 两个字符!因此,只需输入 flag 即可得到 flag。

flag{badunic0debadbad}

「UTF-7 转换工具」题解

代码的意思是:如果我们输入一个字面上不是 “flag” 但从 UTF-7 转换为 UTF-8 后会变成 “flag” 的字符串,就可以得到 flag。

不妨查阅 UTF-7 相关资料。可以得知:一个 Unicode 字符串,在 UTF-7 编码下,可能有多种编码,甚至纯粹的 ASCII 字符串也可以有多种编码!

那么事情就简单了。我们依照 Wikipedia 等参考资料给出的 UTF-7 编码算法,可以构造出 “flag” 的另一种“写法”。比如,选择 f 下手。

f 的 Unicode 码位是 0x66

将 0x66 写成 16 位二进制数:0000 0000 0110 0110

重新分组:000000 000110 011000

使用 base64 的编码表,将每组变成一个字符:AGY

那么最终 “flag” 的另一种 UTF-7 替代写法就是 +AGY-lag,输入即可得到 flag。

flag{please_visit_www.utf8everywhere.org}

文笔生疏,措辞浅薄,望各位大佬不吝赐教,万分感谢。

免责声明:由于传播或利用此文所提供的信息、技术或方法而造成的任何直接或间接的后果及损失,均由使用者本人负责, 文章作者不为此承担任何责任。

转载声明:儒道易行 拥有对此文章的修改和解释权,如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经作者允许,不得任意修改或者增减此文章的内容,不得以任何方式将其用于商业目的。

博客:
https://rdyx0.github.io/先知社区:
https://xz.aliyun.com/u/37846SecIN:
https://www.sec-in.com/author/3097CSDN:
https://blog.csdn.net/weixin_48899364?type=blog公众号:
https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg5NTU2NjA1Mw==&action=getalbum&album_id=1696286248027357190&scene=173&from_msgid=2247485408&from_itemidx=1&count=3&nolastread=1#wechat_redirectFreeBuf:
https://www.freebuf.com/author/%E5%9B%BD%E6%9C%8D%E6%9C%80%E5%BC%BA%E6%B8%97%E9%80%8F%E6%8E%8C%E6%8E%A7%E8%80%85

Hackergame 2020相关推荐

  1. Hackergame 2022 Writeup(来自一位啥都不会的萌新)

    第一次写writeup有不足之处请见谅( 目录 签到 猫咪问答喵 家目录里的秘密 HeiLang Xcaptcha 旅行照片 2.0 线路板 量子藏宝图 企鹅拼盘 签到 众所周知,签到题是一道手速题. ...

  2. 大数据与数据挖掘考试题_北京2020届中考物理出题策略大揭秘!

    精华推荐 ▼ 北京地区物理使用的教材有三个版本,分别是人教版.北师版.课改版,比如西城区.海淀区.朝阳区等使用的是人教版,海淀区使用北师版,丰台区使用课改版.各区平时教学进度略有差异,期末考试.月考等 ...

  3. 使用最新版(2020)IntelliJ IDEA 新建 Spring Boot 2.0 项目

    使用最新版(2020)IntelliJ IDEA 新建 Spring Boot 2.0 项目 一:创建项目,并添加相应依赖 新建Project,并指定Project为Spring Initializr ...

  4. 2020了,还要学JSP嘛?入个门呗!毕竟Servlet亲兄弟~

    目录 1.什么是JSP 2.JSP原理 3.JSP基础语法 jsp表达式 jsp脚本片段 jsp声明 jsp注释 4.JSP指令 5.JSP行为 6.9大内置对象 7.EL表达式 格式 变量 [ ]与 ...

  5. 智能物联网(AIoT,2020年)(下)

    智能物联网(AIoT,2020年)(下) 12工业物联网是AIoT在工业领域第一战场 工业物联网分为感知.决策.执行,OS与软件是大脑+神经 13工业场景下一步如何使用AIoT 不止工业物联网:用人工 ...

  6. 智能物联网(AIoT,2020年)(中)

    智能物联网(AIoT,2020年)(中) 05 中国AIoT产业图谱 06 中国AIoT商业模式 标准程度越低人力和时间成本投入越多,2B2C模式附加值高 07 中国AIoT玩家分布简介 四类玩家,优 ...

  7. 智能物联网(AIoT,2020年)(上)

    智能物联网(AIoT,2020年)(上) 中国AloT的概念与现状 01智能物联网(AIoT)定义 人工智能与物联网的协同应用 02 AIoT2025产业瞭望:家庭AI管家 智能家居交互方式无感化,跨 ...

  8. AIoT 2020 年分析

    AIoT 2020 年分析 2020年,从智能手机到智能手表,从智能摄像头到智能汽车,随着AI.芯片.云计算.通信等基础技术的逐渐成熟,又一个行业来到了历史性的时刻--AIoT. 从"万物互 ...

  9. 2020年人工智能汽车将出台多项标准

    2020年人工智能汽车将出台多项标准 Multiple standards to emerge in 2020 for AI-driven vehicles 新的举措正在揭开自动驾驶人工智能黑匣子的盖 ...

最新文章

  1. 泛域名Wildcard Domain
  2. linux的ls命令详解
  3. 【开源】SpringBootNetty聊天室V1.2.0升级版本介绍
  4. ContextMenuStrip 类
  5. 为什么torch.nn.Linear的表达形式为y=xA^T+b而不是常见的y=Ax+b?
  6. 2018 ACM-ICPC World Finals Problem D.Gem Island
  7. javafx 打开新窗口_新的JMetro JavaFX 11兼容版本
  8. SpringMVC源码解析(四)——请求处理
  9. python封装api给vue_Vue axios api统一管理的封装
  10. 一个中产阶级丈夫给坚持买房妻子的一封信
  11. geotools将shp数据存入postgres
  12. kgtemp文件转mp3工具
  13. 三分钟搭建单节点私链教程
  14. Windows2003 企业版支持红外
  15. R语言的版本更新以及迁移R包
  16. 如何优雅的整合定时批量任务(荣耀典藏版)
  17. 中国到欧洲专线快递要多长时间
  18. php试题答案是非题,PHP试题带答案
  19. Flutter 里的语法糖解析,知其所然方能潇洒舞剑 | 开发者说·DTalk
  20. 计算机台式机硬盘,台式机装硬盘怎么安装_台式电脑硬盘安装教程-win7之家

热门文章

  1. 超级账本Fabric学习(二)Fabric1.0.0网络搭建(中)无业务逻辑处理的Fabric网络
  2. MaterialSkin与系统Panel容器结合使用,实现自适应舒适布局
  3. python--斗地主
  4. 可可粉的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  5. Realme GT Neo5 SE ROOT 解锁BL教程
  6. 历年计算机office试题及答案,历年计算机二级MS Office真题及答案
  7. AES AES/GCM/NoPadding 加密解密
  8. 接单日记(三)文本处理之词云生成
  9. Flutter 淡入淡出效果
  10. 物联网流量卡怎么查流量_物联网卡流量查询(QueryCardFlowInfo)---JAVA