web

Random? [250]

根据提示 “PS:网不好vim线上改代码真是致命”,可能存在 vim 交换文件泄露。下载 /.random.php.swp 后在目录下执行 vim -r random.php 命令恢复源码

审计发现存在反序列化漏洞,构造 payload 使 public 成为 secret 的引用:

emmm=O:4:"emmm":2:{s:6:"public";N;s:6:"secret";R:2;}

提交请求即可获取 flag

Flag: hgame{&_Is_wondeRful!@#}

草莓社区-1 [100]

根据提示,考察 PHP 的 LFI (本地文件包含)漏洞,将参数 mao 的值改为目标 ../flag.php 提交即可返回 base64 编码后的文件内容(Content-Type 被设为 image/png 导致显示为图片),解码即可获取 flag

web_2_1.png

Flag: hgame{#Ma0_pi4n_haO_k4n_ma#}

草莓社区-2 [150]

还是 LFI 漏洞,进行尝试发现可以利用 php://filter 伪协议,构造 payload 提交即可获取 base64 编码后的文件内容,解码即可获取 flag

mao=php://filter/read=convert.base64-encode/resource=../flag.php
web_3_1.png

Flag: hgame{!m4o_pi4n_ChaO_hao_kan!}

xss-1 [100]

根据过滤代码,构造 payload:

  1. 过滤了 scriptimage ,可使用 <img> 等标签
  2. 过滤了 (,可对内容进行 Unicode 编码
<img src="♂" onerror="&#97;&#108;&#101;&#114;&#116;(&#49;)">

Flag: hgame{#X5s_soo00o_e4sy#}

xss-2 [150]

根据过滤代码,构造 payload:

  1. 注入点在 <input> 标签内,可对其增加 type 属性,如 image
  2. 过滤了 scriptimageimg( ,可对内容进行 Unicode 编码
♂" type="&#105;&#109;&#97;&#103;&#101;" src="♂" onerror="&#97;&#108;&#101;&#114;&#116;(&#49;)" name="♂

Flag: hgame{#LuCkY_y0u_a1ert_l#}

最简单的sql题 [50]

SQL 注入送分题,根据提示需要登录 admin 账号,构造 payload 如

username=admin&pwd=123456' or '1'='1

提交请求即可获取 flag

Flag: hgame{@s0ng_fen_ti@}

misc

咻咻咻 [200]

ZIP 伪加密 + 音频 LSB。使用十六进制编辑器修改压缩包的加密标志位为 00 00,即可正常解压出一个 WAV 文件(使用 7-zip 等软件可无视伪加密)
然后使用 ragibson/Steganography 即可从音频文件中提取出隐写数据

misc_1_1.png
$ python WavSteg.py -r -s 咻咻咻.wav -o output -n 1 -b 1000 && cat output
aGdhbWV7aDRwcHlfeGl1X1hpdV94eHh4aVVVfQ==

经 base64 解码即得 flag

Flag: hgame{h4ppy_xiu_Xiu_xxxxiUU}

White cosmos [170]

使用十六进制编辑器打开 pure.txt,可见其并非全是空格(b'\x09')组成,而有部分是制表符(b'\x20')。将制表符替换为 1,空格替换为 0,转换为字符串即得 flag

misc_2_1.png

Flag: hgame{Welc0me_2_WhIte_sp4ce}

easy password [150]

爆破题,使用 ARCHPR 工具即可爆破得到解压密码

misc_3_1.png

Flag: hgame{0pos_You_5ound_m3_HAHA}

mysterious file header [200]

使用十六进制编辑器打开文件,发现文件头 30 40 05 B4 存在异常,可以想到应该是压缩文件的 50 4B 03 04,修改保存后解压可以发现 java 类文件 *.class

misc_4_1.png

使用 jre9 运行程序,点击四个按钮可以得到四个数字,根据提示猜测是 IP 地址。尝试访问各种组合,发现 “http://[REDACTED]/” 挂有一个博客,在文章中可以找到 flag

Flag: hgame{Y0u_Mu5t_know_f1le_header_and_java}

crypto

easy rsa [150]

题中给出 RSA 算法中的数据 N、e、c、h=p+q,在 factordb 查询发现尚未有已知分解

由于给出 p 与 q 之和,展开 (p-1)(q-1) 可以得到 pq-p-q+1,即 N-h+1,将数据代入程序计算即可解得 flag

import binascii

def exGCD(a, b):
    if a == 0:
        return (b, 0, 1)
    else:
        g, y, x = exGCD(b % a, a)
        return (g, x - (b // a) * y, y)

def invMod(a, m):
    g, x, y = exGCD(a, m)
    if g != 1:
        raise Exception('modular inverse does not exist')
    else:
        return x % m

d = invMod(e, N - h + 1)

print(binascii.a2b_hex('%x' % pow(c, d, N)))

Flag: hgame{phi_is_important_too!}

The same simple RSA [150]

需要用到 openssl 与 ius/rsatool 工具,首先从公钥文件 pubkey.pem 中提取出模数 N

$ openssl rsa -pubin -in pubkey.pem -text -modulus
# ...[OMITTED]...
Modulus=C2636AE5C3D8E43FFB97AB09028F1AAC6C0BF6CD3D70EBCA281BFFE97FBE30DD
# ...[OMITTED]...

在 factorDB 查询即可得到分解质数 p 与 q,通过 rsatool 生成私钥文件

$ python rsatool.py -f PEM -o prvkey.pem -p ... -q ...

使用私钥解密文件 flag.enc 即可得到 flag

$ openssl rsautl -decrypt -in flag.enc -inkey prvkey.pem -out flag && cat flag
hgame{Double_ki11!}

Flag: hgame{Double_ki11!}

xasr [300]

解析施工中(据说可能存在更优解法),爆破脚本如下:

from functools import reduce
from pwn import *

def xor(a, b):
    return ''.join([chr(ord(x[0]) ^ ord(x[1])) for x in zip(a, b)])


def add(a, b):
    return ''.join([chr((ord(x[0]) + ord(x[1])) % 256) for x in zip(a, b)])


def sub(a, b):
    return ''.join([chr((ord(x[0]) - ord(x[1])) % 256) for x in zip(a, b)])

nc = remote('[REDACTED]', 23555)
nc.sendline('')
nc.recvline()
nc.recvline()

possibleFlagBytes = [[] for j in range(32)]

requests = 0

for k in range(32):
    plainText = chr(k + 65) * 32
    nc.sendline(plainText)
    cipherText = nc.recvline(keepends=False)[26:].decode('hex')

    for j in range(32):
        if len(possibleFlagBytes[j]) > 0:
            if len(list(reduce(lambda x, y: set(x) & set(y), possibleFlagBytes[j]))) == 1:
                continue
        if len(possibleFlagBytes[j]) <= k:
            for i in range(len(possibleFlagBytes[j]), k + 1):
                possibleFlagBytes[j].append([])
        print('Cracking: flag[%d],\tusing No.%d pair of plainText and cipherText...\tRequests: %d' % (
            j, k + 1, requests))
        for i in range(33, 127):
            msg = list(plainText)
            fm = xor(sub(msg[j - 1], chr(i)), chr(i))
            msg[j] = fm
            nc.sendline(''.join(msg))
            cipherText_new = nc.recvline(keepends=False)[26:].decode('hex')
            if add(chr(i), xor(chr(i), cipherText_new[j])) == cipherText[j - 1]:
                possibleFlagBytes[j][k].append(i)
            requests += 1

flag = ''
for i in range(32):
    flag += chr(list(reduce(lambda x, y: set(x) & set(y), possibleFlagBytes[i]))[0])

print('Flag is: ' + flag)

Flag: hgame{N0w_U_knoW_What_1s_CPA=.=}

Caesar&&Caesar [200]

Vigenère 加密,通过 jameslyons/python_cryptanalysis 的词频分析脚本可以破解出第一句的明文

$ python2 break_vigenere.py
# ...[OMITTED]...
-137.637485699 Vigenere, klen 7 :"ANOTHER", MANYYEARSLATERASHEFACEDTHEFIRINGSQUAD
# ...[OMITTED]...

利用搜索引擎即可发现该句来自《百年孤独》,根据提示即可得到 flag

Flag: hgame{One_Hundred_Years_of_Solitude}

violence [200]

经过修改的 Affine 加密,修改 jameslyons/python_cryptanalysis 的脚本,重写加解密算法即可破解出明文

def encipher(self, string):
    ret = ''
    for c in string:
        if 96 < (ord(c)+97) < 123:
            ret += chr(self.a * (ord(c) + self.b - 97) % 26 + 97)
        else:
            ret += c
    return ret

def decipher(self, string):
    ret = ''
    for c in string:
        if 96 < (ord(c)+97) < 123:
            ret += chr((self.inv_a * ((ord(c) - 97) - self.a * self.b)) % 26 + 97)
        else:
            ret += c
    return ret

Flag: hgame{sometimes_it_takes_a_bit_of_violence}

Categories: CTF

0 Comments

发表评论

Avatar placeholder

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