栈缓冲区溢出攻击的例子

23 篇文章 1 订阅
7 篇文章 0 订阅

栈缓冲区溢出攻击的例子
缓冲区是程序用来存储数据的连续内存区域,一旦分配完成,其起始地址(边界)和大小就固定下来。
当使用缓冲区时,如果使用了超出边界的区域,就称为缓冲区溢出(Buffer overflow)
如果缓冲区分配在栈上,就称为栈缓冲区溢出。如果分配在堆上,称为堆缓冲区溢出。

图1

左侧的0xCC是局部变量区域。具备变量下面是父函数EBP和当前函数的返回地址。具备变量越界,将覆盖父函数EBP和当前函数返回地址。使当前函数返回到意外的地方。

如果这个意外的地方是0,反汇编就是add指令。如果返回到黑客设计的代码(叫shellcode)就会执行恶意代码。

书中举了一个BoAttack的小程序,按书中的代码敲进去,在vs2019是无法执行的。经过几天的研究,我发现新的编译器已经有了CS防护,很难突破,有人总结了新的手段,参见:https://securityboulevard.com/2020/12/a-modern-exploration-of-windows-memory-corruption-exploits-part-i-stack-overflows/amp/

这篇文章很复杂,读起来费劲,暂时按下不表。我需要下载一个没有cs机制的编译器,经典的VC6还没有,搜索了一下vc6,发现微软已经不能下载了,只能从华军软件园下了一个,这个华军从90年代就做这个,竟然还存活到了现在,不容易。但别选中高速下载,会自动下载一堆无用软件。

下面记录一下探索这个程序的过程:

第一步创建一个bo1工程

第二步,建立一个程序的架子,bo1.cpp内容如下:

然后单步执行,确定两个地址位置:SZ_INPUT的位置和 MessageBox的地址:

调用MessageBoxW的位置是00425294,对应汇编代码:FF 15 94 52 42 00 --FF看来是 call的意思。同时也看到SZ_INPUT位置是00422a30

好,两个关键地址记好了,就可以开始补充shellcode了。首先补充一份汇编伪代码,主要是获取反汇编的机器码内容。注意其中的call MessageBoxW这句是不能执行的,之中看不中用。

这段代码的意思:弹出一个Messagebox框,如果点击确定,就继续弹出,如果点击取消,就先入一个死循环,够坏的。执行调试,反汇编得到:

这里面的shellcode 补齐SZ_INPUT的内容:

第一个圈就是MesssageBoxW的地址,第二个圈位置就是返回地址的位置,使用SZ_INPUT的地址覆盖。这两个地址我修改程序好像都没有受到影响,所以可以写死了。

然后编译运行这个程序,发现达到了目的,显示一个丑陋的对话框,点确定又弹出。点取消进入一个死循环。

可以单步跟踪看一下栈被覆盖的过程,断点设置如下:

进入函数前的栈情况:

压入参数:

调用call压入返回地址:

然后压入EBP

用0xCC填充局部变量区:

执行到字符串拷贝,上面的两个地址:返回地址、父函数EBP都被覆盖,注意返回地址的位置,被SZ_INPUT精确填充

当函数 返回命令执行到ret时,就跳转到了新位置:开始执行shellcode

发现中间FF调用的messagebox不对,重新反汇编看看:

MessageBox地址变了,看来增加程序会改变这个地址的,修改shellcode后,这次终于对了:

攻击成功,完美!
 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python是一种高级编程语言,不容易受到基于缓冲区溢出攻击,因为它提供了一些内建的安全功能来对抗此类攻击。但是,如果我们编写了不安全的代码,可能会出现这种情况。 基于缓冲区溢出攻击是指当程序尝试将数据写入缓冲区时,如果没有正确检查输入数据的长度,可能会导致溢出,使得攻击者能够修改程序的执行路径或者执行任意恶意代码。 下面是一个示例代码,用于演示可能导致基于缓冲区溢出攻击的情况: ```python def vulnerable_function(input_data): buffer = [0] * 10 # 创建一个长度为10的缓冲区 # 未正确检查输入数据的长度 if len(input_data) <= 10: for i in range(len(input_data)): buffer[i] = input_data[i] # 对缓冲区内的数据进行处理 # ... ``` 在这个示例代码中,我们创建了一个长度为10的缓冲区,并没有正确检查输入数据的长度。如果攻击者将超过10个字符的输入数据传递给这个函数,就有可能发生缓冲区溢出攻击者可以在溢出的部分中插入恶意代码,从而在程序中执行任意的操作。 为了防止基于缓冲区溢出攻击,在编写代码时应该遵循以下几个原则: 1. 始终对输入数据进行正确的长度检查,并确保不会超过缓冲区的大小。 2. 使用安全的字符串处理函数,如`strncpy()`,来复制字符串到缓冲区,避免溢出。 3. 避免使用不受信任的输入数据来访问数组或缓冲区的索引。 4. 更新Python到最新版本,以获得更强的安全性和基于缓冲区溢出攻击保护。 总的来说,Python在设计上较为安全,不容易受到基于缓冲区溢出攻击。但是,为了保证系统的安全性,我们仍然需要编写安全的代码,并遵循最佳实践来防止此类攻击

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值