buu-[FlareOn6]Overlong

文章讲述了如何使用IDA分析包含加密数据的程序,目标是通过修改循环次数来获取超过默认输出长度的flag。在尝试修改汇编代码以增加输出字节数时,发现会覆盖相邻地址导致程序异常。最终,作者通过修改栈顶元素成功获取完整flag。
摘要由CSDN通过智能技术生成

IDA打开文件

先看看函数MessageBoxs:

MessageBoxA 是 Windows API 中的一个函数,用于显示一个带有消息文本的消息框。它位于 <Windows.h> 头文件中,并具有以下函数原型:

int MessageBoxA(
  HWND    hWnd,
  LPCSTR  lpText,
  LPCSTR  lpCaption,
  UINT    uType
);

其中,参数含义如下:

  • hWnd:可选参数,指定消息框的父窗口句柄。如果指定为 NULL,则消息框将没有父窗口。
  • lpText:要显示的消息文本字符串。
  • lpCaption:可选参数,消息框的标题栏文本。
  • uType:消息框的样式和按钮配置。可以使用预定义的常量值,如 MB_OKMB_YESNO 等。

理解一下程序:

date数据是给出的,flag可以看出来是用messageboxs函数直接显示出来的,我们怎么获取呢?

动调之后可以发现很多问题:

  1. 数据是固定的,经过加密之后是直接打印出来的
  2. 我们不能去修改数据,或者获得数据来直接得到flag
  3. 我们的date很大,远远超过了本应该输出的28个字节

考虑问题:我们可以去获取数据吗,或者自己写代码得到,或者修改输出的字节数

wp:

  1. 正向去得到flag,直接将数据全面脱出来,去修改循环次数
  2. 我们直接去搞程序,把循环次数改了

思路一可以直接去复制粘贴代码

思路二看看用xdbg打开看看

我们可以看到进入程序之后,将我们输出的1c个字节直接传入栈顶了,我们尝试去修改汇编看看

发现了一个问题:

假如我们要实现从1C--->AE会直接将我们的这段汇编区域扩大了3个字节,结果是相邻的地址被覆盖,程序不能正常执行下去。

那不能这样,干干别的比如:去修改栈

我们走到这个去,让栈顶已经变为了1C之后去修改栈顶元素

直接去运行程序去

直接搞到,帅的扣

flag{I_a_M_t_h_e_e_n_C_o_D_i_n_g@flare-on.com}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值