WriteUp-XSCTF2023决赛
只做出来2道题QWQ
学到的知识点
C++ try…catch
C++逆向那道题中有一个函数在运行时引发了一个异常,最后的处理函数是一个Xor()函数,将flag进行了一次特定的异或加密.找了很久才找到,最后看汇编找跳转才找到…不过最后还是不是特别清楚c++的异常机制,毕竟c++编译器底层做的事太多了.
CRC32校验
貌似…是…Crackme那道题是有一个CRC32的校验.
Reverse
esab64
这道题是c++逆向,没有提供pdb文件之前,代码比较混乱,但是还是能分析的,后续提示更新了pdb文件后更加清晰.
总之就是对flag进行了一遍变表base64编码,然后每四个字符一组进行翻转,就是最终的密文.
分析如下(pdb文件提供之前的分析):
反序后再变表base64解码,很简单,但是逆向解码出来后发现乱码:
后续提示去分析c++ try…catch,说明程序中某个地方故意引发了异常,在处理异常的时候进行了一些额外的加密.
去考虑代码,这个额外加密一定在base64之前,因为分析发现(甚至经过了大量的调试验证),最终密文检验确实是base64并反序的密文和真正的密文按顺序比较:
动态调试分析,手动提取出每次比较的两个寄存器值,发现确实就是变表base64(反转过的)的结果依次比较,没有任何问题.
动调前的准备工作:有反调试,patch掉:
另外还有,为了逐个检查比较的字符,还需要对检查密文匹配的循环里的if语句进行修改,让其不会退出循环:
这样就可以进行调试了,最终只剩下那个异常处理的问题了.
在提供了pdb文件后,代码高度还原为c++代码,那个神秘函数名也还原为Exception():
但是进去分析伪代码什么都没有,于是从汇编下手,但是由于知识所限,寻找了很久才找到:
从Exception()函数的汇编进去,发现push了一个结构体stru_FF3CC8
,进去看发现有两个标号$LN5
,$LN6
:
跳转回去查看,最终找到一个"隐藏"的Xor()函数:
(可能分析的不是很对,这里好像就是已经进入函数了?)
代码很简单,我们直接对解密的乱码再如上进行一遍对应的异或即可.
最终的解密代码如下:
1 | # Visit https://www.lddgo.net/string/pyc-compile-decompile for more information |
不过中间可能漏了一些字符之类的,总之经过"合理猜测",最终得出flag.
中毒白块儿
这题直接把检测游戏结束的函数里的代码删了就行…相当于开无敌挂…
然后再去运行,跑一会儿随便点点就出flag了.