栈缓冲区溢出攻击的例子

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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值