百度杯“百度杯”CTF比赛 十一月场 Reverse CrackMe01 Writeup

题目链接:https://www.ichunqiu.com/battalion

取文本框中内容的函数是GetWindowTextW,给GetWindowTextW下断点,运行,5次F9之后,才可以在文本框中输入字符,随便输入123456789,鼠标放在click上后就从running状态变成了Paused,继续运行,会将输入拷贝到另一个地方,然后调用PostMessage函数。

用IDA动态调试,可以看到PostMessage函数各个参数的值,lParam是输入的个数,wParam是输入的内容。hWnd是接收消息的窗口句柄。

(只有前几次调试的时候会执行到PostMessage,后面调试都一直在循环调用GetWindowTextW出不来)

发送消息的函数:SendMessage

寄送消息的函数:PostMessage

消息的接收:GetMessage、PeekMessage

PostMessageW的第一个参数是接收消息的窗口句柄,查看它的交叉引用,发现了一共被两个函数使用。

查看402990,hWnd是调用CreateWindowExW之后得到的窗口句柄。

RegisterClassW注册一个窗口类,以便在调用CreateWindow或CreateWindowEx函数时使用。CreateWindow只是将某个WNDCLASS定义的窗体变成实例。 WndClass中的成员lpfnWndProc指向一个回调函数,是窗体的消息处理函数,回调函数格式如下。

会把输入的字符给wParam,字符个数给lParam。

查看消息处理函数4027F0

程序会对每一个输入做累加和异或,计算完之后,会判断一下输出+i*2累加之和是否为0x4B6,如果是,则显示窗口。写程序,将chText与0x4B6异或,得到FLAG。

#include "stdafx.h"

#include <Windows.h>

int _tmain(int argc, _TCHAR* argv[])

{

    int chText[]={0x4F0,0x4DA,0x4D7,0x4D1,0x48c,0x4ff,0x4f5,0x4fe,0x4e3,0x4f8,0x4e7,0x4ff,0x4e3,0x4e9,0x4f0,0x4f3,0x485,0x480,0x484,0x4F2,0x4F4,0x4F3};

    for (int i=0;i<22;i++)

    {

        printf("%c",chText[i]^0x4B6);

    }

    system("pause");

    return 0;

}

flag{ICHUNQIU_FE362DBE}

这两天忙着准备比赛,没时间完成任务了,唉,从6月份就开始说7月份比赛,但是一直都偷懒没准备(因为只是替补)结果happy了,替补上场了,下次无论在什么位置,都要好好准备。临阵磨枪,ctf的题真的好难啊,比样本可难分析多了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值