BUUCTF - [FlareOn6]Overlong

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}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值