题目要求:求出由RC4异或的密文所对应的明文,秘钥存在于文件中,考察RC4算法的理解和对安全加密的应用 Eswink技术学习
Flag:SYC{vKRZqCCBMMCyLlKlFKNmTpLqAKzriyqAxYjIqRgzCXKxuFDBOarNQl}
pwn checksec level2
本题涉及到了RC4算法,并且该题中,有一处发生了改变
经过百度查询到的RC4的加密算法中,异或前 (a1[v5]+a1[v6])%256
而这里反编译出来的伪代码中缺少了mod 256
这一个步骤,非常地困惑,想不通,自写地全部崩溃,人都是麻的。最终还是走到了调试这一步。
由于以前接触过类似RC4
自加密算法的样本文件,通常是将加密key加密保存在data
或者text
段,需要解密加密的PE文件时再对key进行解密调用
本题的Key已经给的很明显了,为下面这一段长度为300的字符串:
qppxdtedZrekKSpAMeqzNoewKQjEFTOMaFNCQiLeMFGgwlmuaQXIcMGzIJllPmrEFfHvzXNbBAxtKbuUvkaGqFvoXWIBeHNyfSjmpbpZHsNKYnkgBsTVjVSfVfxdQenTgochitWHrIfAcVuhNAqhZZTHInByioFsvcMQRGWiDeyixcvIlntEFJAzXJNYWjEjQoDfErYtnJWQxVBOIjKgjTzDrYVrfXYCbZwNTmVjrKNjQGFhQCzWTsqdEvligyAfnlqzqeHsrXDoekoVaPERUeMivpBNobzjWupBzFdngrYO
经过了解,我们可以得知RC4
的加解密其实就是:明文 ^ key = 密文
,解密步骤也是相同,密文 ^ key = 明文
,那么我们直接将密文传入内存或者读入再RC4
解密,即可获得明文
我们观察伪代码,可以清楚的看到,在进行RC4
加密初始化时,经过了异或操作,那么我们可以手动Patch代码
.text:000000000000175C
修改为: jmp 00000000000017A1
.text:0000000000001772
修改为: jmp short loc_17A1
即为无条件跳转,保存完毕文件后再次通过IDA分析,即可看到循环消失
尝试将密文转化为字符串通过gets
的方式读入,但是转换后发现存在乱码和其他符号会直接被截断,通过使用PWN
也无法传入,也许时本人活儿不精。
那么我们只好进行远程调试,在gets
处断点,步过到strlen
并且修改内存的值:
data = [0xB7, 0x65, 0x0C, 0x52, 0xF1, 0x59, 0x62, 0x6B, 0xD8, 0xD7, 0x19, 0x2E, 0xFA, 0xFE, 0xFF, 0x25, 0x82, 0xAC,0x3F, 0x79, 0x60, 0x2A, 0x1E, 0x81, 0x78, 0xD7, 0x60, 0x0E, 0x99, 0xD0, 0x68, 0xC4, 0xF9, 0x37, 0x54, 0xAE,0xF2, 0x77, 0xBF, 0x39, 0x1D, 0xC7, 0x61, 0x0B, 0xF8, 0xED, 0xFD, 0x80, 0xF2, 0xAA, 0x6E, 0x62, 0xB9, 0x63,0x0B, 0x79, 0xC6, 0xBB, 0xA9]
在修改内存时,我也遇到了一些不顺手的地方,如果是在windows环境下的ollydbg,编辑内存值非常容易,将data转换为HEX String 然后复制就行了,不过IDA好像没有这个功能,也不知道有没有人写过这种插件,导致我按byte输入,异常地麻烦。
在修改完内存并且单步rc4_crypt
后,密文就成功解密了。
解密后的字符串,使用LazyIDA插件将其转换为PythonList:
decrypt = [76, 70, 92, 100, 105, 84, 77, 69, 110, 92, 92, 93, 82, 82, 92, 102, 83, 115, 84, 115, 89, 84, 81, 114, 75, 111, 83, 110, 94, 84, 101, 109, 118, 102, 110, 94, 103, 70, 117, 86, 110, 77, 120, 101, 92, 71, 84, 103, 106, 89, 91, 93, 80, 126, 109, 81, 78, 115, 98]
由于之前我们省略了异或步骤,所以我们这里再次异或:
decrypt = [76, 70, 92, 100, 105, 84, 77, 69, 110, 92, 92, 93, 82, 82, 92, 102, 83, 115, 84, 115, 89, 84, 81, 114, 75,
最终可以得到答案:
SYC{vKRZqCCBMMCyLlKlFKNmTpLqAKzriyqAxYjIqRgzCXKxuFDBOarNQl}
将得到的flag读入Level2,得到正确结果:
Call
rc4_init
和 rc4_crypt
来完成,劫持跳转也可以达到同样的结果