Hackergame 2020

news2024/11/26 4:11:34

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 = 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.超简单的世界模拟器

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 random

MAP_SIZE = 50
CONTROL_SIZE = 15
STEP = 200
FLAGS = [(5, 45), (25, 45)]


def flag_range(flag):
    x, y = flag
    for i in range(2):
        for j in range(2):
            yield x + i, y + j


class Game:
    def __init__(self, W, H):
        self.W = W
        self.H = H
        self.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] = 1

    def 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 = 0
                for 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 += 1
                if cnt == 3:
                    new[i][j] = 1
                elif cnt == 2:
                    new[i][j] = self.map[i][j]
                else:
                    new[i][j] = 0
        self.map = new

random.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.map
    for i in range(STEP):
        game.step()
        if game.map == last:
            break
        last = game.map

    cnt = 0
    for i, flag in enumerate(FLAGS):
        if all(not game.map[x][y] for x, y in flag_range(flag)):
            cnt += 1
    print("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/37846

SecIN:
https://www.sec-in.com/author/3097

CSDN:
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_redirect

FreeBuf:
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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/345846.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTML+CSS

HTML技术 什么是HTML Hyper Text Markup Language HTML&#xff1a;超文本标记语言&#xff0c;内部全部是一些不同的标记符号。 通俗的来讲&#xff1a;其实就是“网页”。 HTML 网页 网页的特点&#xff1a; 1、所有的网页都是通过【浏览器】来进行解析的。2、所有的网…

【MySQL】子查询

这里写自定义目录标题子查询1、子查询的基本使用2、 单行子查询2.1、单行比较查询2.2、HAVING 中的子查询2.3、CASE中的子查询3、多行子查询4、相关子查询5、EXISTS 与 NOT EXISTS关键字子查询 子查询指一个查询语句嵌套在另一个查询语句内部的查询&#xff0c;这个特性从MySQ…

算法笔记(四)—— 排序算法总结及链表

排序算法稳定性 值相同的元素排序结束后能否保持相对秩序不变。 冒泡排序具有稳定性&#xff08;相等时不交换&#xff09;。 插入排序具有稳定性。 归并排序具有稳定性&#xff08;merge的时候&#xff0c;相等时先拷贝左边的&#xff0c;小和问题让其丧失了稳定性&#x…

557. 反转字符串中的单词 III

给定一个字符串 s &#xff0c;你需要反转字符串中每个单词的字符顺序&#xff0c;同时仍保留空格和单词的初始顺序。 方法一&#xff1a;使用额外空间 思路与算法 开辟一个新字符串。然后从头到尾遍历原字符串&#xff0c;直到找到空格为止&#xff0c;此时找到了一个单词&a…

Http中你必须知道那点事

1, HTTP 1.1 简介 HTTP概念 HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff0c;规定了浏览器和服务器之间数据传输的规则。 数据传输的规则指的是请求数据和响应数据需要按照指定的格式进行传输。如果想知道具体的格式&#xff0c;可以打开浏览器&#xf…

2、线程、块和网格

目录一、线程、块、网格概念二、代码分析2.1 打印第一个线程块的第一线程2.2 打印当前线程块的当前线程2.3 获取当前是第几个线程一、线程、块、网格概念 CUDA的软件架构由网格&#xff08;Grid&#xff09;、线程块&#xff08;Block&#xff09;和线程&#xff08;Thread&am…

Allegro如何设置导入Subdrawing可自由选择目录操作指导

Allegro如何设置导入Subdrawing可自由选择目录操作指导 用Allgro做PCB设计的时候,导入Subdrawing是非常常用的功能,在导入Subdrawing的时候,通常需要把Subdrawing文件放在需要导入PCB的相同目录下,不能自由选择,如下图 但是Allegro是支持自由选择目录的,只需按照下方的步…

Sphinx文档生成工具(一)

Sphinx在项目中部署应用 一、将安装的Sphinx发布 创建FindSphinx.cmake&#xff0c;这个名字只能是这个 find_program(SPHINX_EXECUTABLE NAMES sphinx-buildHINTS$ENV{SPHINX_DIR}HINTS ${SPHINX_ROOT}/binPATH_SUFFIXES binDOC "Sphinx documentation generator"…

企业为什么需要绩效管理软件?

随着经济的发展&#xff0c;企业的竞争日益激烈&#xff0c;“纸上谈兵”的绩效考核机制已经远远不能满足企业管理的需要。因此&#xff0c;企业绩效管理软件的重要性也日益凸显。 绩效管理软件可以提高企业管理效率、提高HR工作效率、提高员工工作能力。 今天就来给大家详细…

【C++】从0到1入门C++编程学习笔记 - 实战篇:演讲比赛流程管理系统

文章目录一、演讲比赛程序需求1.1 比赛规则1.2 程序功能1.3 程序效果图&#xff1a;二、项目创建2.1 创建项目2.2 添加文件三、创建管理类3.1创建文件3.2 头文件实现3.3 源文件实现四、菜单功能4.1 添加成员函数4.2 菜单功能实现4.3 测试菜单功能五、退出功能5.1 提供功能接口5…

RiproV2主题右侧美化右侧导航美化RiproV2主题右侧个人中心美化保持常驻

背景: RiproV2主题右侧美化右侧导航美化RiproV2主题右侧个人中心美化保持常驻 原样式没有文字只有图标,修改之后有文字,并且保持常驻在右侧,不随页面滚动而滚动 下面是楼主网站优化后的效果:

Linux中定时监控Tomcat服务器进程并在进程结束时重启Tomcat服务器

目录一、问题二、解决方法1、创建定时任务文件2、修改Tomcat的部分文件3、添加系统的定时调度4、执行monitor.sh文件5、查看脚本执行的日志文件一、问题 当我们的Tomcat配置完成后投入使用后&#xff0c;在用户使用一定时间后&#xff0c;Tomcat可能会出现一些问题导致进程结束…

mybatis-plus ---2

mybatis-plus插件 官网地址 分页插件 MyBatis Plus自带分页插件&#xff0c;只要简单的配置即可实现分页功能 配置并使用自带分页插件 Configuration MapperScan("com.itzhh.mapper")//可以将主类中的注解移到此处 public class MybatisPlusConfig {Beanpublic …

MySQL数据库调优————OPTIMIZER_TRACE详解

OPTIMIZER_TRACE是MySQL5.6引入的一项跟踪功能&#xff0c;它可以跟踪优化器做出的各种决策&#xff08;比如访问表的方法、各种开销计算、各种转换等&#xff09;&#xff0c;并将跟踪结果记录到INFORMATION_SCHEMA.OPTIMIZER_TRACE表中。此功能默认关闭&#xff0c;开启后 &a…

工业智能网关解决方案:物联网仓储环境监测系统

仓储是连接生产、供应和销售的中转系统&#xff0c;对于促进生产、提高效率有着重要的辅助作用。对于很多大型工厂或食品厂来说&#xff0c;需要对仓储环境进行严控的控制&#xff0c;以确保产品或食品的质量&#xff0c;避免不必要的产品损耗&#xff0c;提高产品存管的水平。…

Redisson分布式锁基本使用及可重入锁原理分析

基本使用 1、引入依赖 <!-- redisson依赖 --><dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.13.6</version></dependency>2、配置redisson客户端 // 将RedissonClie…

【每日随笔】手指训练 ( 手指训练作用 | 哪些人需要手指训练 | 手指操 | 手指康复训练器材 )

文章目录一、手指训练作用二、哪些人需要手指训练三、手指操四、手指康复训练器材产品需求探索 , 研究下手指训练的市场 , 前景 , 是否可以开发 ; 一、手指训练作用 手指训练作用 : 改善 上肢协调性手眼 协调性训练提高 手指 抓握 能力提高 手指 灵活性提高 上肢运动 准确性 和…

vscode下进行python配置及编码,新手学习

介绍在开发工具vscode下进行python的配置及编码&#xff0c;新手来学。 1、首先下载及安装最新版本的vscode。 【VSCode最新版本下载安装详细教程&#xff08;win10)】 2、下载安装最新版本python&#xff0c;也可以根据需要下载自己需要的版本。 【python3.11下载安装详细…

基于Web的6个完美3D图形WebGL库

现代前端、游戏和Web开发正是WebGL可以转化为数字杰作的东西。使用GPU绘制在浏览器屏幕上生成的矢量元素&#xff0c;WebGL创建交互式Web图形&#xff0c;从而获得用户体验。视觉元素的质量和复杂性使该工具在HTML或CSS等其他方法中脱颖而出。WebGL基础WebGL不是一个图形套件。…

电脑录屏用什么软件?推荐这3款软件,用过都说好

如今网络中&#xff0c;有很多的软件都能够实现电脑录屏。但想要找一个方便好用的电脑录屏软件却十分困难。电脑录屏用什么软件&#xff1f;今天小编将为小伙伴分享3款超级方便好用的电脑录屏软件&#xff0c;用过的小伙伴都说好&#xff01;一起来看看吧。 电脑录屏软件1&…