缓冲区溢出利用实验

(一)缓冲区原理验证

1.创建含有缓冲区溢出漏洞的程序,定义全局变量name[]并赋值为17个a,在main函数里定义8字节的buffer[8],在调用strcpy函数时会发生缓冲区溢出。

2.判定main函数的地址。使用Ollydbg打开生成的可执行文件,借助IDA快速找到main地址。00401005是jmp main,所以其跳转到的00401010就是main函数的位置。

3.定位调用main函数的语句。在IDA中键入ctrl+X,通过交叉引用找到call main的位置,00401694位置的call语句就是调用main的位置。

在Ollydbg中找到00401694,并按F2设置断点。

在Ollydbg中用F9执行到断点00401694时,栈的情况如下图,在地址为0012FF88的位置。call语句执行时,会先将后面的语句的地址入栈,即将00401699入栈,call语句执行结束后会执行00401699对应的指令。

单步步入(F7)后,栈的情况如下图,即把00401699入栈到地址为0012FF84的位置,再跳到00101005去调用mian函数。

继续执行,可看到为main函数分配了0x4c的空间,并在后面执行过程中将地址为0012FF34到0012FF7C的内存全部填充为C。继续执行到00401031的位置,发现有call语句,到IDA中查看00401031的位置是call strcpy。

执行00401031的语句,为name分配的地址00422A30和为buffer分配的地址0012FF78入栈,查看00422A30位置的内容为name的内容17个a(a的ASCII码为61)。

执行完strcpy函数后,从0012FF78到0012FF88的位置变成了a,因缓冲区溢出,原来0012FF84所保存的返回地址00401699被覆盖。

(二)缓冲区漏洞利用及Shellcode编写

1. 用C语言编写Shellcode并转化为十六进制代码。

2.当main函数执行完毕跳出时,ESP内的值自动变为下一个地址,即从0012FF84变为0012FF88,这与0012FF84里的内容是否被覆盖无关。所以只要将shellcode放在0012FF88的内置,然后使用jmp ESP,使程序执行以ESP的值为地址的代码。

3.jmp ESP的机器码为FFE4,获取其保存地址,本次使用0x77e35b79。

4.在name中先用12个字节的内容覆盖从buffer内容到保存main函数返回地址(401699)的地方,后面直接加上jmp ESP命令的地址和shellcode。因系统是小端显示,所以jmp ESP命令的地址写成:\x79\x5b\xe3\x77,后面直接使用汇编语言转换的机器码执行,结果如下图。

实验结果

验证了缓冲区溢出原理,并通过shellcode实现了缓冲区溢出的利用。

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_20381661

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值