PE32位程序,打开ida分析伪代码得到关键函数

还见过base64解码的re分析一下base64解码的伪代码
for ( i = 0; i != 64; ++i )
{
while ( byte_404000[i] != *v3 )
{
if ( ++i == 64 )
goto LABEL_7;
}
LOBYTE(v14) = i;
}
do
{
while ( byte_404000[i] != a1[v4 + 1] )
{
if ( ++i == 64 )
goto LABEL_11;
}
BYTE1(v14) = i++;
}
while ( i != 64 );
for ( j = 0; j != 64; ++j )
{
while ( byte_404000[j] != *v7 )
{
if ( ++j == 64 )
goto LABEL_15;
}
BYTE2(v14) = j;
}
for ( k = 0; k != 64; ++k )
{
while ( byte_404000[k] != *v9 )
{
if ( ++k == 64 )
goto LABEL_19;
}
HIBYTE(v14) = k;
}
base64编码先是对字符串进行3字节->4字节操作后用4字节的每个字节的值在base64_table上找对应的值,那么解码就先将解码的字符串在码表上找到其对应位置在进行4字节->3字节的操作,上面部分代码就是在码表上找对应位置,将每个位置放在一个int类型的变量中对应四个字节。
*(a2 + v5) = (4 * HIBYTE(v14)) | (BYTE2(v14) >> 4) & 3;
*(a2 + v5 + 1) = (16 * BYTE2(v14)) | (BYTE1(v14) >> 2) & 0xF;
v5 += 3;
*(a2 + v5 - 1) = (BYTE1(v14) << 6) | v14 & 0x3F;
上述代码进行4字节->3字节的操作
上述解码后的结果有26位即13字节,但base64解码后必须是3的整数倍故将最后的0xff舍弃,得到解码后的值46ED1896569ED272B2B38070,对其进行hex2str在进行base64操作得到Y0uReallyKn0wB4s,我们输入的flag有20位,Y0uReallyKn0wB4s有十六位,题目给出三个等号和MD5对其进行爆破

import hashlib
flag = 'Y0uReallyKn0wB4s'
for i in range(32,128):
a = flag + chr(i) + '==='
if hashlib.md5(a.encode()).hexdigest() == '5a3ebb487ad0046e52db00570339aace':
print(a)
break
得到Y0uReallyKn0wB4s3===
Comments NOTHING