zl程序教程

您现在的位置是:首页 >  其他

当前栏目

Reverse: Level2 & 动态调试修改内存 Cracked by Eswink

2023-04-18 14:45:24 时间

题目要求:求出由RC4异或的密文所对应的明文,秘钥存在于文件中,考察RC4算法的理解和对安全加密的应用 Eswink技术学习

Information

 Flag:SYC{vKRZqCCBMMCyLlKlFKNmTpLqAKzriyqAxYjIqRgzCXKxuFDBOarNQl}

Necessary Tools

  1. IDA 7.5 Linux Cracked by ericyudatou
  2. Pwntools
  3. Pycharm && Python3

Debugging Environment

  1. Linux kali 5.10.0-kali9-amd64
  2. Windows 10

Decompile

检测程序架构信息

pwn checksec level2

RC4

本题涉及到了RC4算法,并且该题中,有一处发生了改变

经过百度查询到的RC4的加密算法中,异或前 (a1[v5]+a1[v6])%256而这里反编译出来的伪代码中缺少了mod 256 这一个步骤,非常地困惑,想不通,自写地全部崩溃,人都是麻的。最终还是走到了调试这一步。

由于以前接触过类似RC4自加密算法的样本文件,通常是将加密key加密保存在data或者text段,需要解密加密的PE文件时再对key进行解密调用

本题的Key已经给的很明显了,为下面这一段长度为300的字符串:

qppxdtedZrekKSpAMeqzNoewKQjEFTOMaFNCQiLeMFGgwlmuaQXIcMGzIJllPmrEFfHvzXNbBAxtKbuUvkaGqFvoXWIBeHNyfSjmpbpZHsNKYnkgBsTVjVSfVfxdQenTgochitWHrIfAcVuhNAqhZZTHInByioFsvcMQRGWiDeyixcvIlntEFJAzXJNYWjEjQoDfErYtnJWQxVBOIjKgjTzDrYVrfXYCbZwNTmVjrKNjQGFhQCzWTsqdEvligyAfnlqzqeHsrXDoekoVaPERUeMivpBNobzjWupBzFdngrYO

经过了解,我们可以得知RC4的加解密其实就是:明文 ^ key = 密文,解密步骤也是相同,密文 ^ key = 明文 ,那么我们直接将密文传入内存或者读入再RC4解密,即可获得明文

Modify

跳过异或循环

我们观察伪代码,可以清楚的看到,在进行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,得到正确结果:

Reflection & Proposal

  • 办法总比困难多,羊毛出在羊身上
  • 本次题目还可以通过 Call rc4_initrc4_crypt来完成,劫持跳转也可以达到同样的结果
  • IDA修改内存及其不方便,希望能够有个批量修改的插件,常去大佬群看看