前言
本文主要记录CrackRTF和[MRCTF2020]Transform的解题过程和相关思路
CrackRTF
首先使用exeinfope
查看是否有加壳,发现是32位程序,且没有加壳
使用IDA打开,找到_main
函数,再进入main_0
函数,发现首先需要输入一个六位数的数字,并使用atoi
将输入的字符串转为数字
接着调用了一个sub_40100A
函数,点进去发现又调用了sub_401230
函数,观察其代码,发现是进行了SHA-1 的哈希,并将结果由lpString1
返回,即main_0
函数中String1
的值为SHA-1的结果
随后将String1
与一段字符串进行不区分大小写的比较
由于知道是六位数的数字,所以可以考虑使用脚本来爆破,成功得到六位数字为123321
随后又需要输出六个字符,不过这次就没有用atoi
函数来进行转换,所以可能不是纯数字的组合
发现随后执行了sub_401019
函数,点进去发现执行了sub_401040
函数,再点进去发现其实这个函数和上面的哈希函数类似,不过这里使用的是MD5
首先像上面一样,看看能不能爆破出纯数字,发现不行,那就只能接着往下看了(爆破字符加数字的组合会比较耗时 ),发现下面还有一个sub_40100F
函数,其调用了sub_4014D0
函数
注意到其中还调用了sub_401005
函数,其又调用了sub_401420
函数,点击查看函数具体代码,可以看出其具体的作用是使用字符串'xxxxxx123321@DBApp'
与指定资源的全部字节进行循环亦或
而异或后的内容将会被写入dbapp.rtf
文件中,那么既然是rtf文件,其部分字节数据(如文件头字节数据)应该要符合rtf的文件规范,那么查看下rtf的文件规范,发现了一个特点
那么就是当指定资源字节数据的前六个字节与'xxxxxx123321@DBApp'
中前六个字节的数据进行异或的结果应该为{\rtf1
,这里用Resource Hacker查看对应资源的字节数据,发现前六个字节为05 7D 41 15 26 01
那么就可以编写脚本来完成异或的逆运算(异或的逆运算为异或 ),得到第二个密码~!3a@0
那么这时运行程序,输入两个密码后,会生成一个dbapp.rtf
,打开即可看到flag
{N0_M0re_Free_Bugs}
[MRCTF2020]Transform
首先查壳,发现没有壳,且为64
位,直接用IDA打开
打开后找main函数,发现主要是对数据的字符串进行了重新排位和异或操作
点进dword_40F040
和byte_40F0E0
查看数组元素
注意:这里的8 dup(0)
代表8个0,并以逗号隔开,即0,0,0,0,0,0,0,0
,加起来正好满40
,另外一个3Fh dup(0)
也是类似
那么可以直接写脚本来进行逆运算
dword_40F040 = [0x9, 0x0A, 0x0F, 0x17, 0x7, 0x18, 0x0C, 0x6, 0x1, 0x10, 0x3, 0x11, 0x20, 0x1D, 0x0B, 0x1E, 0x1B, 0x16,
0x4, 0x0D, 0x13, 0x14, 0x15, 0x2, 0x19, 0x5, 0x1F, 0x8, 0x12, 0x1A, 0x1C, 0x0E, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00]
actual_dword_40F040 = [9, 10, 15, 23, 7, 24, 12, 6, 1, 16, 3, 17, 32, 29, 11, 30, 27, 22, 4, 13, 19, 20, 21, 2, 25, 5, 31,
8, 18, 26, 28, 14, 0, 0, 0, 0, 0, 0, 0, 0]
byte_40F0E0 = [0x67, 0x79, 0x7B, 0x7F, 0x75, 0x2B, 0x3C, 0x52, 0x53, 0x79, 0x57, 0x5E, 0x5D, 0x42, 0x7B, 0x2D, 0x2A,
0x66, 0x42, 0x7E, 0x4C, 0x57, 0x79, 0x41, 0x6B, 0x7E, 0x65, 0x3C, 0x5C, 0x45, 0x6F, 0x62, 0x4D, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
E0_XOR_40 = []
for i in range(33):
E0_XOR_40.append(hex(dword_40F040[i] ^ byte_40F0E0[i]))
result = []
for i in range(33):
for j in range(33):
if new_dword_40F040[j] == i:
result.append(E0_XOR_40[j])
for c in result:
print(chr(int(c, 16)), end="") # MRCTF{Tr4nsp0sltiON_Clph3r_1s_3z}