reverse3
每日一道reverse的题,可多不能少
打开题目先检查有无壳,以及多少位的,这题是没有壳的就不做过多的演示了,所以我们直接进入主题。
打开IDA,用shift+F12搜索字符串
发现其中的关键字
然后双击进入
这里我们首先要先选中一个函数然后按ctrl+X,然后再按F5进入反汇编,这里可以很直观的看到这里应该就是一个main函数。
这里我们先来分析一下这一段程序的简单逻辑
首先接收一个输入的字符串
然后要经过一个加密函数
这里我们跟进一下这个加密函数
源代码
int __cdecl sub_411AB0(char *a1, unsigned int a2, _DWORD *a3)
{
int v4; // [sp+Ch] [bp-100h]@1
int v5; // [sp+D4h] [bp-38h]@7
int i; // [sp+E0h] [bp-2Ch]@7
int v7; // [sp+ECh] [bp-20h]@1
void *Dst; // [sp+F8h] [bp-14h]@1
char *v9; // [sp+104h] [bp-8h]@1
memset(&v4, 0xCCu, 0x100u);
v9 = 0;
Dst = 0;
v7 = 0;
if ( a1 && a2 )
{
v7 = a2 / 3;
if ( (a2 / 3) % 3 )
++v7;
v7 *= 4;
*a3 = v7;
malloc(v7 + 1);
Dst = sub_411127();
if ( Dst )
{
j_memset(Dst, 0, v7 + 1);
v9 = a1;
v7 = a2;
i = 0;
v5 = 0;
while ( v7 > 0 )
{
byte_41A144[2] = 0;
byte_41A144[1] = 0;
byte_41A144[0] = 0;
for ( i = 0; i < 3 && v7 >= 1; ++i )
{
byte_41A144[i] = *v9;
--v7;
++v9;
}
if ( !i )
break;
v4 = i;
if ( i == 1 )
{
*(Dst + v5++) = aAbcdefghijklmn[byte_41A144[0] >> 2];
*(Dst + v5++) = aAbcdefghijklmn[((byte_41A144[1] & 0xF0) >> 4) | 16 * (byte_41A144[0] & 3)];
*(Dst + v5++) = aAbcdefghijklmn[64];
*(Dst + v5++) = aAbcdefghijklmn[64];
}
else if ( v4 == 2 )
{
*(Dst + v5++) = aAbcdefghijklmn[byte_41A144[0] >> 2];
*(Dst + v5++) = aAbcdefghijklmn[((byte_41A144[1] & 0xF0) >> 4) | 16 * (byte_41A144[0] & 3)];
*(Dst + v5++) = aAbcdefghijklmn[((byte_41A144[2] & 0xC0) >> 6) | 4 * (byte_41A144[1] & 0xF)];
*(Dst + v5++) = aAbcdefghijklmn[64];
}
else if ( v4 == 3 )
{
*(Dst + v5++) = aAbcdefghijklmn[byte_41A144[0] >> 2];
*(Dst + v5++) = aAbcdefghijklmn[((byte_41A144[1] & 0xF0) >> 4) | 16 * (byte_41A144[0] & 3)];
*(Dst + v5++) = aAbcdefghijklmn[((byte_41A144[2] & 0xC0) >> 6) | 4 * (byte_41A144[1] & 0xF)];
*(Dst + v5++) = aAbcdefghijklmn[byte_41A144[2] & 0x3F];
}
}
*(Dst + v5) = 0;
}
}
return sub_411127();
}
在代码的下部分,可以看到Dst会经过aAbcdefghijklmn[]数组的变换,打开此处
从’ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='可以看出,这个函数应该是base64的加密函数,因此只需要解密即可。
这里贴上一个脚本.
import base64
str1 = "e3nifIH9b_C@n@dH"
flag = ""
s = ""
for i in range(0,len(str)):
s += chr(ord(str1[i]) - i)
flag = base64.b64decode(s)
flag = flag.decode('ASCII')
print(flag)