IDA打开文件
先看看函数MessageBoxs:
MessageBoxA
是 Windows API 中的一个函数,用于显示一个带有消息文本的消息框。它位于 <Windows.h>
头文件中,并具有以下函数原型:
int MessageBoxA( HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType );
其中,参数含义如下:
hWnd
:可选参数,指定消息框的父窗口句柄。如果指定为NULL
,则消息框将没有父窗口。lpText
:要显示的消息文本字符串。lpCaption
:可选参数,消息框的标题栏文本。uType
:消息框的样式和按钮配置。可以使用预定义的常量值,如MB_OK
、MB_YESNO
等。
理解一下程序:
date数据是给出的,flag可以看出来是用messageboxs函数直接显示出来的,我们怎么获取呢?
动调之后可以发现很多问题:
- 数据是固定的,经过加密之后是直接打印出来的
- 我们不能去修改数据,或者获得数据来直接得到flag
- 我们的date很大,远远超过了本应该输出的28个字节
考虑问题:我们可以去获取数据吗,或者自己写代码得到,或者修改输出的字节数
wp:
- 正向去得到flag,直接将数据全面脱出来,去修改循环次数
- 我们直接去搞程序,把循环次数改了
思路一可以直接去复制粘贴代码
思路二看看用xdbg打开看看
我们可以看到进入程序之后,将我们输出的1c个字节直接传入栈顶了,我们尝试去修改汇编看看
发现了一个问题:
假如我们要实现从1C--->AE会直接将我们的这段汇编区域扩大了3个字节,结果是相邻的地址被覆盖,程序不能正常执行下去。
那不能这样,干干别的比如:去修改栈
我们走到这个去,让栈顶已经变为了1C之后去修改栈顶元素
直接去运行程序去
直接搞到,帅的扣
flag{I_a_M_t_h_e_e_n_C_o_D_i_n_g@flare-on.com}