buu-刮开有奖 1

(本文章是参考其他作者的文章写下来的,如有错误,欢迎指正)
1、winmain函数
基于 Windows 的图形应用程序的用户提供的入口点。
2、DialogBoxParamA函数
从对话框模板资源创建模式对话框。 在显示对话框之前,函数会将应用程序定义的值作为WM_INITDIALOG消息的 lParam 参数传递给对话框过程。 应用程序可以使用此值初始化对话框控件。
图片是该题目在ida(32位)打开后f5反编译的伪代码(图片是该题目在ida(32位)打开后f5反编译的伪代码)
3、关于v7-v17,看到5-15行的注释,[esp+8h]…[esp+30h],编译器为其分配的地址是连续的,且数据类型都是int(占4字节),38-48行进行赋值,推断可能是数组。sub_4010F0((int)&v7, 0, 10)是对v7进行处理,v7是数组首元素的地址,应该是取该数组的前10位进行处理。string是flag,长度=8(这也是通过参考其他博主的题解推测的)
在这里插入图片描述

在这里插入图片描述4、sub_4010F0((int)&v7, 0, 10)是对v7-v16进行处理,将sub_4010F0((int)&v7, 0, 10)函数放入visual studio内运行,得到处理后的v7-v16。
(ps:这里第12行(4 * i + a1)是编译器对数组的寻址方式,相当于a1[i],4*i表示该数组的数据类型占4字节)
在这里插入图片描述

5、51-54行,推测v20-v22是char类型的数组,因为char占1字节所以分配内存空间是[esp+36h],[esp+37h],sub_401000(&v26, strlen(&v26))是base64加密(可以取看其他博主的题解)。v4、v5分别存放base64加密后的字符
在这里插入图片描述

在这里插入图片描述
6、MessageBoxA弹出对话框函数,if语句内表达式成立即弹出,题目的提示:在编辑框中的输入值,即为flag,所以if语句内的表达式是flag的关键。
在这里插入图片描述

在这里插入图片描述总的来说,取v7-v16数组前10个数进行处理,v20-v22数组和v23-v25数组进行base64加密,满足if表达式的条件。flag由string、v19、v20、v21和解密后的v4、v5构成。
下面是sub_4010F0((int)&v7, 0, 10)在visual studio运行的代码,以及if表达式的部分flag

#include<Windows.h>
#include<iostream>
int __cdecl sub_4010F0(int a1, int a2, int a3)
{
    int result; // eax
    int i; // esi
    int v5; // ecx
    int v6; // edx

    result = a3;
    for (i = a2; i <= a3; a2 = i)
    {
        v5 = 4 * i;
        v6 = *(DWORD*)(4 * i + a1);
        if (a2 < result && i < result)
        {
            do
            {
                if (v6 > *(DWORD*)(a1 + 4 * result))
                {
                    if (i >= result)
                        break;
                    ++i;
                    *(DWORD*)(v5 + a1) = *(DWORD*)(a1 + 4 * result);
                    if (i >= result)
                        break;
                    while (*(DWORD*)(a1 + 4 * i) <= v6)
                    {
                        if (++i >= result)
                            goto LABEL_13;
                    }
                    if (i >= result)
                        break;
                    v5 = 4 * i;
                    *(DWORD*)(a1 + 4 * result) = *(DWORD*)(4 * i + a1);
                }
                --result;
            } while (i < result);
        }
    LABEL_13:
        *(DWORD*)(a1 + 4 * result) = v6;
        sub_4010F0(a1, a2, i - 1);
        result = a3;
        ++i;
    }
    return result;
}
int main()
{
    int v7[] = { 90,74, 83,69,67,97, 78,72,51, 110,103 };
    int i;
    sub_4010F0((int)(&v7), 0, 10);
    printf("%c", v7[0] + 34);
    printf("%c", v7[4]);
    printf("%c", (v7[2] * 3 + 141) / 4);
    printf("%c", (v7[7] / 9) * 2 * 4);
    return 0;
}

运行结果:
在这里插入图片描述v4 base64解密得jMp,v5得WP1,最后flag{UJWP1jMp}

参考链接:
1、winmain函数:https://learn.microsoft.com/zh-cn/windows/win32/api/winbase/nf-winbase-winmain?redirectedfrom=MSDN
2、DialogBoxParamA函数:https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-dialogboxparama?redirectedfrom=MSDN
3、数组的寻址是在这位博主的题解:https://blog.csdn.net/afanzcf/article/details/119682630
4、参考题解:https://www.bilibili.com/video/BV14Z4y1f7DJ/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值