运行
1.查壳
32位exe程序,没有壳。
2.用32位IDA打开
找到main函数,扫一眼汇编代码看不出来什么信息,F5查看伪代码
可以根据
while ( *((_BYTE *)v5 + v3) == byte_40E0E4[v3] )
{
if ( ++v3 > strlen((const char *)v5) )
goto LABEL_6;
}
推测出v5
跟byte_40E0E4
相同。
双击byte_40E0E4
看里面的内容
是一段字符串,这里要记得7A
也是字符串的内容,对应ASCII码的z
。
拿到v5
之后,接着往上看,出现一个函数sub_401080
,可以推断出是对我们输入的v8
进行了加密,得到了v5
。
查看函数内容
看了下应该是base64加密,对密文解密得到的却是乱码。这其中一定还有其他操作。
发现这个函数里面又出现了两个函数sub_401000()
和sub_401030(a3)
分别分析其作用
这个函数是把我们要用到的base64加密表给换了。
这个函数的参数a1是加密后的字符串v5。
它的作用是把大写转换为小写,小写转换为大写,数字不变。
加密流程就是 明文->更换base64加密表->用换了的表对明文进行加密->大小写转换->密文。
开始写脚本
import base64
v5='zMXHz3TIgnxLxJhFAdtZn2fFk3lYCrtPC2l9'
v5=list(v5)
for i in range(0,len(v5)):
if ord(v5[i])>=ord('A') and ord(v5[i])<=ord('Z'):
v5[i]=chr(ord(v5[i])+32)
elif ord(v5[i])>=ord('a') and ord(v5[i])<=ord('z'):
v5[i]=chr(ord(v5[i])-32)
key=('')
for i in range(0,len(v5)):
key+=v5[i]
print(key)
String1='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
String2=String1
String1=list(String1)
for i in range(6,15):
v1=String1[10+i]
String1[10 + i]=String1[i]
String1[i]=v1
b654String=''
for i in range(0,len(String1)):
b654String+=String1[i]
print(b654String)
print(base64.b64decode(key.translate(str.maketrans(b654String,String2))))
>>>flag{bAse64_h2s_a_Surprise}
flag{bAse64_h2s_a_Surprise}
补充
对于base64编码表的转换,我们还可以使用一个在线自定义base编码