二刷buu,发现网上的这个题的题解大部分都是动调(可能是我没找到静态),于是想写一篇纯静态分析的文章。
这个题的考点如名字所示,就是一个魔改base64和rc4加密。
首先拖进ida
上面那8个硬编码赋值一看就像key,直接改了个名。
看到结尾的密文对比,顿时有了个大致方向
进入sub_4006B6函数里面,发现是rc4的s盒初始化
传入的参数是放s盒的数组,key和key的长度
没看出来的可以看下这个博客,关于rc4加密的
https://www.cnblogs.com/zwios/p/4196836.html
然后下面的sub_4007DB函数显然就是rc4的crypt函数,查看代码发现没有魔改,很棒。
接下来看sub_4008FA函数
这里从padding和&0x3f等很容易联想到base64(从最后对比的密文也可以很容易联想到),但是这里的base64和正常的base64不一样,因为我们惊奇的发现没有表,而换成了另一种逻辑:
1.把我们的输入(rc4加密过的输入)三个字节一组,变成四个六位的数(这里和base64原理一样)
2.把四个数每个加上61,存入输出的数组之中。
对,就改了第二步,所以我们直接手撕一下就行。
由此,总的程序逻辑清晰了:
1.先将输入rc4加密,key已知。
2.将加密的结果魔改base64加密
3.和密文进行对比
脚本如下:
from base64 import *
import binascii
from Crypto.Util.number import *
duibi="Z`TzzTrD|fQP[_VVL|yneURyUmFklVJgLasJroZpHRxIUlH\\vZE="
# for i in range(len(duibi)-1):
# print(hex(ord(duibi[i])-61),end=",")#得到shuru
shuru=[0x1d,0x23,0x17,0x3d,0x3d,0x17,0x35,0x7,0x3f,0x29,0x14,0x13,0x1e,0x22,0x19,0x19,0xf,0x3f