只做出来2道题QWQ

学到的知识点

C++ try…catch

C++逆向那道题中有一个函数在运行时引发了一个异常,最后的处理函数是一个Xor()函数,将flag进行了一次特定的异或加密.找了很久才找到,最后看汇编找跳转才找到…不过最后还是不是特别清楚c++的异常机制,毕竟c++编译器底层做的事太多了.

CRC32校验

貌似…是…Crackme那道题是有一个CRC32的校验.

Reverse

esab64

这道题是c++逆向,没有提供pdb文件之前,代码比较混乱,但是还是能分析的,后续提示更新了pdb文件后更加清晰.

总之就是对flag进行了一遍变表base64编码,然后每四个字符一组进行翻转,就是最终的密文.

分析如下(pdb文件提供之前的分析):

image-20231106160411279

反序后再变表base64解码,很简单,但是逆向解码出来后发现乱码:

image-20231106160643056

后续提示去分析c++ try…catch,说明程序中某个地方故意引发了异常,在处理异常的时候进行了一些额外的加密.

去考虑代码,这个额外加密一定在base64之前,因为分析发现(甚至经过了大量的调试验证),最终密文检验确实是base64并反序的密文和真正的密文按顺序比较:

image-20231106161422267

动态调试分析,手动提取出每次比较的两个寄存器值,发现确实就是变表base64(反转过的)的结果依次比较,没有任何问题.

动调前的准备工作:有反调试,patch掉:

image-20231106161959207 image-20231106162029511 image-20231106162112078

另外还有,为了逐个检查比较的字符,还需要对检查密文匹配的循环里的if语句进行修改,让其不会退出循环:

image-20231106162337894 image-20231106162510282

这样就可以进行调试了,最终只剩下那个异常处理的问题了.

在提供了pdb文件后,代码高度还原为c++代码,那个神秘函数名也还原为Exception():

image-20231106162721729

但是进去分析伪代码什么都没有,于是从汇编下手,但是由于知识所限,寻找了很久才找到:

从Exception()函数的汇编进去,发现push了一个结构体stru_FF3CC8,进去看发现有两个标号$LN5,$LN6:

image-20231106163916637 image-20231106164039570

跳转回去查看,最终找到一个"隐藏"的Xor()函数:

image-20231106164218206

(可能分析的不是很对,这里好像就是已经进入函数了?)

image-20231106164316316

代码很简单,我们直接对解密的乱码再如上进行一遍对应的异或即可.

最终的解密代码如下:

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
# Visit https://www.lddgo.net/string/pyc-compile-decompile for more information
# Version : Python 3.7

import base64
from string import *


def decrypt2():
# 方法2
# str1 = 'UYP7wQcTBee0Z6V3t66TAbJK+YCKWZPhVpf3R5P4ZHcEWVP5yiXFXHr4W4OBmT=='
# 4个字符一组,反转:
str1 = '7PYUTcQw0eeB3V6ZT66tKJbAKCY+hPZW3fpV4P5REcHZ5PVWFXiy4rHXBO4WTm=='
string1 = 'ABCDEFQRSTUVWXYPGHIJKLMNOZabcdefghijklmnopqrstuvwxyz0123456789+/'
string2 = 'm2jrJbkftp1KoBFNZhwE56OysH0z473T8VRW9l/PGixgdM+UeQCaDucXIYSnLvqA'
flag = base64.b64decode(str1.translate(str.maketrans(string2, string1)))

# 上面的解密结果有一点问题?
# 最终用在线网站进行解密导出,并进行合理猜测得出flag
# 乱码,甚至爆破都发现没有任何哪3个字符能编码出7PYU
flag = b'v~o\x7flRk\x0c\x0dz\x15P}UH,A\x7f/.nFt#xraru"OfPRxc;zWp6w5g#|'
print(flag)
for i in range(46):
print(chr(flag[i] ^ (len(flag) - i)), end='')

decrypt2()

不过中间可能漏了一些字符之类的,总之经过"合理猜测",最终得出flag.

中毒白块儿

这题直接把检测游戏结束的函数里的代码删了就行…相当于开无敌挂…

image-20231106164912110

image-20231106164928927

然后再去运行,跑一会儿随便点点就出flag了.