BUUCTF - [FlareOn6]Overlong
交流逆向工程相关知识 +Q1906661021
下载题目之后,打开看到了一个安装程序
一开始还以为是对这个安装程序逆向,后来发现只是个下发题目的软件
找个地方把题目弄下来
打开题目之后,发现如上窗口弹出,既无输入也无按钮,总感觉冒号后面有东西没有写完
利用逆向软件分析一通
进入ida之后发现,代码简短的吓人,基本只是对数据进行处理之后,直接用messagebox输出,来看看是怎么处理的数据
以下我们采用两种解法来操作这道题:①在ida宏定义的情况下,根据伪代码,复现加密过程 ②动态调试
一:由于代码较为简短,将ida中的伪代码复制下来后,统一数据类型,明确变量传递关系,复现结果如下:
char unk_402008[] =
{
224, 129, 137, 192, 160, 193, 174, 224, 129, 165,
193, 182, 240, 128, 129, 165, 224, 129, 178, 240,
128, 128, 160, 224, 129, 162, 114, 111, 193, 171,
101, 224, 128, 160, 224, 129, 180, 224, 129, 168,
193, 165, 32, 193, 165, 224, 129, 174, 99, 193,
175, 224, 129, 164, 240, 128, 129, 169, 110, 193,
167, 192, 186, 32, 73, 240, 128, 129, 159, 193,
161, 193, 159, 193, 141, 224, 129, 159, 193, 180,
240, 128, 129, 159, 240, 128, 129, 168, 193, 159,
240, 128, 129, 165, 224, 129, 159, 193, 165, 224,
129, 159, 240, 128, 129, 174, 193, 159, 240, 128,
129, 131, 193, 159, 224, 129, 175, 224, 129, 159,
193, 132, 95, 224, 129, 169, 240, 128, 129, 159,
110, 224, 129, 159, 224, 129, 167, 224, 129, 128,
240, 128, 129, 166, 240, 128, 129, 172, 224, 129,
161, 193, 178, 193, 165, 240, 128, 128, 173, 240,
128, 129, 175, 110, 192, 174, 240, 128, 129, 163,
111, 240, 128, 129, 173
};
int __cdecl sub_401000(char* a1, char* a2)
{
int v3; // [esp+0h] [ebp-8h]
char v4; // [esp+4h] [ebp-4h]
if ((int)(unsigned __int8)*a2 >> 3 == 30)
{
v4 = a2[3] & 0x3F | ((a2[2] & 0x3F) << 6);
v3 = 4;
}
else if ((int)(unsigned __int8)*a2 >> 4 == 14)
{
v4 = a2[2] & 0x3F | ((a2[1] & 0x3F) << 6);
v3 = 3;
}
else if ((int)(unsigned __int8)*a2 >> 5 == 6)
{
v4 = a2[1] & 0x3F | ((*a2 & 0x1F) << 6);
v3 = 2;
}
else
{
v4 = *a2;
v3 = 1;
}
*a1 = v4;
return v3;
}
unsigned int __cdecl sub_401160(char* a1,char* a2, unsigned int a3)
{
unsigned int i; // [esp+4h] [ebp-4h]
for (i = 0; i < a3; ++i)
{
a2 += sub_401000(a1, a2);
if (!*a1++)
break;
}
return i;
}
int main()
{
char Text[128]; // [esp+0h] [ebp-84h] BYREF
int v6; // [esp+80h] [ebp-4h]
v6 = sub_401160(Text, unk_402008, 28);
Text[v6] = 0;
int i;
for (i = 0; i < 28; ++i)
{
printf("%c", Text[i]);
}
return 0;
}
我们不难发现原本长度不短的unk_402008变量,在函数中只用到了前28位,我们根据之前的推断,有理由怀疑,是否在进行变量操作时,函数取的变量位数过少
尝试将28改为80,果然如此,结果如下:
二:利用动态调试直接获取结果
进入用户程序区,在ida静态分析之后,我们能很明显看出程序的逻辑结构
push 1C,即位函数调用的常量,也是我们能修改的地方,我们让程序push进去一个大一点的数
步过几次之后,我们即可看到寄存器中出现了flag
flag{I_a_M_t_h_e_e_n_C_o_D_i_n_g@flare-on.com}