(62)[BJDCTF 2020]encode
我们查壳
他是ELF文件格式
我们要调试他的话是得用liunx系统。
我们提前打开虚拟机吧
而且还有壳,我们脱壳吧
enc:E8D8BD91871A1E56F53F4889682F96142AF2AB8FED7ACFD5E
我们逆向从后往前看,我把函数名字改了,我们熟悉的名字。
然后我们进入rc4逐步分析
很显然,上面sub_8048cc2这个函数用用来初始化Sbox
所以我们下面就是rc4加密了。
关于rc4我们知道他是对称密码,我们加密解密可以倒着来。所以懂我意思,我们在动调的时候改一下我传入的参数,改成密文,我们就可以倒转,的到解密数据,不用去写解密脚本了。
还有,根据观察,前面的flag....是我们的key只不过放在同一地址里面了,放的位置不同,类似于我们知道的那种malloc这中自己分配的内存
开始实践,直接动调。
1.我们知道,前面让我们输入的input长度是21
注意:这个题不论输入多长都进不去,需要我们下断点去修改寄存器的值,来步过
看我操作
在这里下断点,然后我们动调
现在我们来输入21个‘a
’
我们可以看到这个条件是15h,而我们不论输入多少都是1C,这是没办法避免的。所以我们需要改一下eax的值然后我们f5去下一个断点
然后我们进入v5
从FF91653C这个地方开始,就是我们要传入的数据,所以我们将密文,改进去,写个脚本
我们改成功之后,我们直接进入rc4内部去下断点
sbox让他去初始化,然后后面我们直接在步过就可以得到我们的加密数据
要运行到result这一步嗷,我没上传截图
我们再打开v5去查看我们刚才那会改写的数据
以下就是我们的加密数据,让我们提取出来,一定要提取对,多少个数据
unsigned char ida_chars[] =
{
0x23, 0x15, 0x25, 0x53, 0x08, 0x1A, 0x59, 0x38, 0x12, 0x6A,
0x39, 0x31, 0x27, 0x5B, 0x0B, 0x13, 0x13, 0x08, 0x5C, 0x33,
0x0B, 0x35, 0x61, 0x01, 0x51, 0x1F, 0x10 0X5C
};
前面,我们根据函数,我们也知道前面是关于base64的换表加密,
所以我们只需要换表解密一下就好了
BJD{0v0_Y0u_g07_1T!}