运行程序:
拖进ida:
首先输入flag,判断长度是否小于32,小于的话就跳转,不小于的话,就进行transform_1((const char )&input_flag);,然后transform_2();,transform_3(strlen((const char )&input_flag), (int)&input_flag, (int)a0);之后比较返回结果和”TRLT5amLBoLT5Z6Fa5LqN6mkTomqR66Da4LqX5mgBwkkP5wmTZ6D====”比较,相等返回0,则程序可以输出Congratulations!!!
看见显眼的=号base64,32解密一下,无果,怪不得题目名字叫base++,可能是又改了东西。
1.看第一个函数transform_1((const char *)&input_flag);
目的:仅对flag大小写字母进行移位操作
2.transform_2();函数:
数组内容:’ABCDEFGHIJKLMNOPQRSTUVWXYZ’
目的:对密码表进行变换操作
3.transform_3(strlen((const char *)&input_flag), (int)&input_flag, (int)a0);函数:
目的:对flag进行加密,每5个字符生成一个数值v4,将v4移位后分成5位二进制数作为密码表的索引下标,加密方法类似于base32,但是密码表是出题人自己定义的。
base_tran_5(v3 + input_flag, v5, v4);函数
分析到这,来整理一下思路:
现在还没有确定flag长度,但根据分析函数flag5位-》密文8位 可知长度位32,
1.将flag进行变换
2.对密码表进行变换
3.对flag进行每5个字符加密,生成8个5位二进制数,在密码表索引密文最后生成密文
例:
在这里给一下思路 该代码每次使用五个字符
比如我输入
abcdefghijklmn
那么先取abcde
在内存中就是6162636465
eax只存62636465 edx存00000061
6162636465 换成二进制就是
0110000101100010011000110110010001100101
每五个位分成一组
01100 00101 10001 00110 00110 11001 00011 00101
每一组换成十进制后当成序号取密码表中的值换成密文
脚本:# coding=utf-8
def transform_1(flag):
v2 = 0
while v2<len(flag):
v3 = ord(flag[v2])
if (abs(v3-97)<=25):
flag[v2] = chr((v3 - 84) % 26 + 97)
if (abs(v3-65)<=25):
flag[v2] = chr((v3 - 52) % 26 + 65)
v2+=1
return flag
#生成密码表
str=list("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
def transform_2(str):
transform_1(str)
slen=len(str)
for i in range(slen):
if i%2==1:
str[i]=chr(ord(str[i])+32)
str.append("7")
str.append("6")
str.append("5")
str.append("4")
str.append("3")
str.append("2")
return str
print (transform_2(str))
byte=['N', 'o', 'P', 'q', 'R', 's', 'T', 'u', 'V', 'w', 'X', 'y', 'Z', 'a', 'B', 'c', 'D', 'e', 'F', 'g', 'H', 'i', 'J', 'k', 'L', 'm', '7', '6', '5', '4', '3', '2']
enc=list("TRLT5amLBoLT5Z6Fa5LqN6mkTomqR66Da4LqX5mgBwkkP5wmTZ6D2222")
#返回密文在密码表中的下标
def index(s):
for i in range(32):
if s==byte[i]:
return i
#解密
for i in range(0,56,8):
v=7
flag=0
for j in range(8):
flag+=index(enc[i+j])<<5*v
v-=1
print ("%x"%flag)
#16进制变ASCII字符
flagstr="31306e373870706e33726f30306f373072326f706f70357333726f71713933370ffff"
a1=[]
for i in range(0,len(flagstr),2):
s=flagstr[i:i+2]
a1.append(chr(int(s,16)))
print (a1)
#最后对flag进行变换
for i in range(32):
if 97<ord(a1[i])<123:
a1[i]=chr(ord(a1[i])-97+84)
if 65<ord(a1[i])<90:
a1[i]=chr(ord(a1[i])-65+52)
print ("".join(a1))
|