这次比赛依旧是一个人,只做了逆向,虽然一道题也没做出来,
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)
其他题目就没有看了,其实这三道题复现完也挺简单的,还是得提升石粒呀!