这次比赛依旧是一个人,只做了逆向,虽然一道题也没做出来

chase

使用FCEUX运行nes文件,是个这样的游戏:

通过设置分数跳关,分数的数值存货在固定的地址上:0x84,跳到最后给出第一段flag:

接着直接看PPU查看器,发现第三段 flag:

第二段flag在PPU查看器中发现F对应的图块为0x26,所以FLAG这几个字符对应的数据为262C2127,但是要注意的是数字应该看下面而不是上面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
cipher = "262C21270030340ED200262F3200392F35002933000112A4000118302C2139D12ED93DD6202DD3333D00019ABDADAD6D000103B9ADAD6E000103B9ADAD6E0001030D0103000110000100"

import binascii
cipher = binascii.a2b_hex(cipher)

table = {}
charac = ord("A")
for i in range(0x21, 0x3B):
table[i] = charac
charac += 1
charac = ord("0")
for i in range(0xD0,0xDA):
table[i] = charac
charac += 1
table[0x20] = ord("@")
table[0] = ord(" ")
table[0x3d] = ord("_")
flag = ""
for i in range(len(cipher)):
for v,k in table.items():
if int(cipher[i]) == v:
flag += chr(k)
print(flag)

关于NES相关内容在 NESDEV.wiki 中有很多,但比较分散

portable

这道题不是传统的libc库,是静态链接的cosmopolitan libc,没有符号,这么一大堆sub看着头疼,在strings窗口找到相关字符串:

找不到它们的引用,根据其他大佬的wp,找立即数可以找到,但我这报错,试了7.7,7.5的IDA都是,没有头猪了:

ctrl s找到data段,发现一个字符串cosmopolitan, 找到了407F30函数,一个简单异或,pycharm,utf-8编码接出来除了英文其他是乱码,用厨子:

这是赛后复现,看到大佬的wp才知道用厨子可以,这要是我正常比赛过程中碰到乱码,肯定会怀疑是自己做错了。。。

linuxpdf

这道题挺有意思的,在pdf中实现了一个linux系统,不会,赛后复现

谷歌浏览器打开后等一段时间,加载完a9文件出现输入flag,关键在这个a9文件,要提取出来,这是个开源项目,看他的js代码中有先zlib压缩,再base64编码:

找到embeded_files中的a9那一项,简单处理一下,放到厨子里解压解码,然后保存文件:

使用IDA9可以看到反编译的伪代码,其他版本的IDA我试了都不行。。

发现是md5算法,29位字符的flag,计算28次,每次计算当前位到最后一位,那么最后一个hash值就是flag后两位字符的md5,使用hascat爆破一下,爆破出来最后两个字符为 F}

剩下的部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
from hashlib import md5

hashv = """38f88a3bc570210f8a8d95585b46b065
83055ae80cdc8bd59378b8628d733fcb
fa7daffbd7acec13b0695d935a04bc0f
c29cc0fd3801c7fdd315c782999bd4cb
2ba2d01af12d9be31a2b44323c1a4f47
ddeebaf002527a9ead78bd16684573cc
bf95b89934a1b555e1090fecdfd3da9f
b6422c30b02938535f8e648d60a87b94
08c1b76643af8dd50cb06d7fdd3cf8ed
42d69719f97088f06540f412dc1706fb
a1f23da61615400e7bd9ea72d63567eb
4e246f0a5dd3ce59465ff3d02ec4f984
b8cf25f963e8e9f4c3fdda34f6f01a35
2d98d820835c75a9f981ad4db826bf8e
702ead08a3dd56b3134c7c3841a652aa
d2d557b613662b92f399d612fb91591e
e4422b6320ed989e7e3cb97f369cba38
71803586c67059dda32525ce844c5079
83b371801d0ade07b5c4f51e8c6215e2
b0d1b4885bc2fdc5a665266924486c5f
792c9e7f05c407c56f3bec4ca7e5c171
3855e5a5bbc1cbe18a6eab5dd97c063c
886d45e0451bbba7c0341fe90a954f34
3a437cbe6591ea34896425856eae7b65
34304967a067308a76701f05c0668551
d6af7c4fedcf2b6777df8e83c932f883
df88931e7eefdfcc2bb80d4a4f5710fb
cb0fc813755a45ce5984bfba15847c1e""".split()

known_flag = "F}"

for j in range(26, -1, -1):
for i in range(32, 127):
if md5((chr(i) + known_flag).encode()).hexdigest() == hashv[j]:
known_flag = chr(i) + known_flag
print(known_flag)
break

print(known_flag)

其他题目就没有看了,其实这三道题复现完也挺简单的,还是得提升石粒呀!