CrackRTF&[MRCTF2020]Transform


前言

本文主要记录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_40F040byte_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}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值