良心发现来把几百年前选拔赛的wp补了,毕竟热身赛有放fufu那道misc(逃
放个仓库传送门:scnu-sloth/hsctf-2021-trial: ISCNU x Sloth 网络安全研究组 2021 选拔赛 题目及wp
Misc
Where is my fufu?
图片名字fufufufu.png
说明这一张图片里有两个fufu,需要把这个图片合并的东西拆出来,而且Hint里也有提binwalk不是万能的,那可以试试binwalk,虽然可以扫到但-e
分不出来(binwalk一下——图片隐写常规套路了)
所以用另一个拆分的软件foremost
(硬件里经常用
就可以在output/png
里找到两张图片:
然后这里有提示说是两张一样的图片 (老婆),这时候就要试试盲水印了。
(注意,盲水印有很多种不同的版本,一个拆不出来可以多试几个,毕竟你也不知道出题人用的是哪个)
这里的盲水印用的是chishaxie/BlindWaterMark: 盲水印 by python,用这个脚本直接解就能得到:
flag:flag{T0ver_sto1e_my_FUFU_-TAT-}
Reverse
Guess
签到题,主要难点估计在去除花指令上。
这里是函数没有识别正确,跳过去重新转一下函数就好(按u
把这一段undefined掉,然后重新p
生成函数)
下面没有识别出来的手动按c
转代码
然后反编译出了sub_11C9()
,可以看到最后是puts结尾,猜测只是一个混淆输出,与程序逻辑没什么关系。
主函数这边有两个经典的call $+5
式花指令,在RE套路 - 关于逆向常客花指令 | c10udlnk_Log中有解析,实际上等同于相同长度的nop(空指令)
然后转函数就能拿到主函数逻辑:
loc_1232
的地方也是没有识别到的,需要跳过去进行转换。
可以转出来是:
一个printf,又是没什么用的(打印出来的估计是提示信息
所以其实就是让输入的s满足(dword_4020[i] ^ s[i]) == dword_4040[i]
就可
写wp:
1 | dst = [0x22, 0x5F, 0x43, 0x76, 0x2E, 0x34, 0x5C, 0x56, 0x07, 0x21, 0x37, 0x5C, 0x28, 0x15, 0x3A, 0x1B, 0xFE, 0x12, 0x01, 0x30, 0xED, 0xE9, 0x15, 0x0A, 0x65, 0xB8, 0xF5, 0x77, 0x00, 0x00, 0x00, 0x00] |
flag:flag{potatso_so_vegetable!}
ezMath
拖进ida发现很诡异,可以用ExEinfoPE等查壳软件看到有upx壳。
用upx 3.94版本能直接脱壳(神奇),高版本因为magic字节被出题人 (也就是我) 魔改所以会报l_info
的错误(
通过这篇文章可以知道l_info实际上是前面的一段header(不同版本的upx有不同的offset)
正常来说一个upx加壳文件会出现三次magic字节(UPX!
,还是在那篇文章中可以看到是被魔改的YTS\x99
,如下图),一次在头部,两次在尾部。
可以看到在头部的magic字节后的第三第四字节是0D 0C
,而尾部最后一个magic字节后紧跟着的两个字节也是0D 0C
,实际上这两个字节正是标明版本相关(具体不用管hhh,反正就在这个位置就对了)。
于是类推一下可以找到这个文件头部被魔改的magic应该在哪里:
所以06 22 11 03
部分应为UPX!
(这里埋了个小彩蛋嘿嘿,dddd
所以把这里改成UPX!
就可以正常脱壳啦~
脱壳以后开始分析,发现这是一个简单的交互,要回答所有式子的答案,全部正确以后就可以获得flag。
然而要回答0xDEAD次,所以必不可能是手答(整整五万多次呢)
有两种思路,一是Python写个自动交互计算的程序,然后摁跑,模拟手答:
1 | from pwn import * |
题目也有写,最后flag是交md5
所以过十几秒就能跑出flag:
二是模拟程序执行的逻辑,手动把所有的答案都算出来,毕竟随机数种子都给了,直接cv一下重现ida里的代码就好:
1 |
|
然后把结果存到exp2.txt
里,最后对所有答案进行md5操作:
1 | from hashlib import md5 |
flag:flag{474a444e5d6cb14261e8408e891ac1b8}
babyvm
啊~ VM题出得累死累活的,又累出题人又累选手,flag还那么棒 (究极拉仇恨) ,结果居然没人做TAT (防AK大成功
没什么好说的啦,就硬逆呗,记住每个opcode的作用然后写个解析器就ok了(符号表都没去,手下留情了555)
剩下的就是看汇编=v=
解析器:
1 | ins_set={ |
得到的res.txt
:
1 | Addr Code |
很标~准的汇编啦,稍微捋捋逻辑就出来了:
1 | dst = [10, 1, 15, 8, 19, 125, 90, 29, 1, 23, 121, 86, 19, 126, 15, 26, 99, 31, 17, 6, 30, 11, 19, 72, 26, 17, 105, 31, 68, 25, 19, 14] |
flag:flag{T0ver_1s_my_boyfri3nd_h4ha}
搞定,下班(逃