缓冲区溢出实验 5 Snprintf
实验环境、代码、及准备
https://www.cnblogs.com/lqerio/p/12870834.html
vul5
Snprintf函数,百度百科:
将可变个参数(...)按照format格式化成字符串,然后将其复制到str中。
(1) 如果格式化后的字符串长度 < size,则将此字符串全部复制到str中,并给其后添加一个字符串结束符('\0');
(2) 如果格式化后的字符串长度 >= size,则只将其中的(size-1)个字符复制到str中,并给其后添加一个字符串结束符('\0'),返回值为欲写入的字符串长度。
查阅资料可知:
snprintf(buf, sizeof buf, arg);
snprintf()函数,该函数的作用为将第三个参数生成的格式化字符串拷贝到第一个参数中,拷贝的大小由第二个参数进行设置。并且其会根据格式化字符串的形式进行替换:在遇到格式化字符串参数之前,它会先将字符拷贝,当遇到格式化字符参数时,该函数会对指定的格式化字符进行替换。
%n:将%n之前printf已经打印的字符个数赋值给偏移处指针所指向的地址位置,如%100×10$n表示将0x64写入偏移10处保存的指针所指向的地址(4字节),而%$hn表示写入的地址空间为2字节,%$hhn表示写入的地址空间为1字节
格式参考了:
https://blog.csdn.net/u010517901/article/details/46486341
https://blog.csdn.net/qq_36779888/article/details/89684453
故此次溢出的构造应该是构造合适的arg,从而构造合适的参数(%n),从而修改snprintf函数的返回地址,跳转到payload。
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";
exploit5
Gdb /tmp/vul5
Disas foo
0x80484cb 0x80484e3
先构造一个简单的payload,用做测试
gdb -e exploit5 -s /tmp/vul5
catch exec
r
break *0x80484cb
c
此时刚刚进入foo,ebp,buf地址分别为
B snprintf
此时disas查看snprintf的汇编
查看此时的,ebp,esp及其内容,可见snprintf没有改变ebp,而esp(0xbffffb2c)指向的是0x80484e8,是snprintf的返回地址(下一条指令),所以我们只要构造合适的payload,覆盖0xbffffb2c中的返回地址,使其指向我们的payload即可。
所以payload需要使用合适的参数修改esp(0xbffffb2c)的值。能修改的参数只有%n,写入的数据是已经输出的字符数,所以只需要构造合适的数目的字符就可以修改为指定地址。(比如40个字符,就写入0x28)
Vul5中,Snprintf用到%u参数时不断的修改buf,所以返回的地址不能是buf,那么只能是arg。
查看arg的地址:重新gdb调试,在foo break查看
为 0xbffffcd4,而buf地址在0xbffffb3c,相差408字节,为了不覆盖到arg,payload需要不超过408字节。(这里我觉得其实snprintf限制了不超过buf的400字节了)
考虑到添加一些nop,最终返回地址可以是&arg+0x40=0xbffffd14
字符串长度不应该过长,所以每次修改esp指向的一字节。比如往esp(0xbffffb2c)写入0xbffffcf4的f4,需要有16*f+4=244个字符
写fc需要252个字符,ff需要255字符,最后的bf,需要191个字符
修改地址的payload部分为
然后填nop和shellcode即可
然后这样出了问题,总是跳到一个随机的地址
Gdb调试,发现是arg的地址出错。是0xbffffe62
目标地址改为 0xbffffea2即可
缓冲区溢出实验 5 Snprintf的更多相关文章
- 2018-2019-2 20165232《网络对抗技术》Exp1 缓冲区溢出实验
2018-2019-2 20165232<网络对抗技术>Exp1 缓冲区溢出实验 实验点1:逆向及Bof基础实践 实践任务 用一个pwn1文件. 该程序正常执行流程是:main调用foo函 ...
- 2018-2019-2 20165225《网络对抗技术》Exp1 缓冲区溢出实验
2018-2019-2 20165225<网络对抗技术>Exp1 缓冲区溢出实验 声明 虽然老师在邮箱中要求要把虚拟机名改为个人名字缩写,但是我的kali好像不是很听话...重启数次也没用 ...
- Kali学习笔记33:Linux系统缓冲区溢出实验
之前做过一个Windows应用SLmail的缓冲区溢出的实验 这次来做一个Linux平台的缓冲区溢出实验: 缓冲区溢出是什么? 学过汇编的应该知道,当缓冲区边界限制不严格时,由于变量传入畸形数据或程序 ...
- Kali学习笔记21:缓冲区溢出实验(漏洞发现)
上一篇文章,我已经做好了缓冲区溢出实验的准备工作: https://www.cnblogs.com/xuyiqing/p/9835561.html 下面就是Kali虚拟机对缓冲区溢出的测试: 已经知道 ...
- 使用Linux进行缓冲区溢出实验的配置记录
在基础的软件安全实验中,缓冲区溢出是一个基础而又经典的问题.最基本的缓冲区溢出即通过合理的构造输入数据,使得输入数据量超过原始缓冲区的大小,从而覆盖数据输入缓冲区之外的数据,达到诸如修改函数返回地址等 ...
- 2017-2018-2 20179215《网络攻防实践》seed缓冲区溢出实验
seed缓冲区溢出实验 有漏洞的程序: /* stack.c */ /* This program has a buffer overflow vulnerability. */ /* Our tas ...
- SEED缓冲区溢出实验笔记
缓冲区溢出实验(Linux 32位) 参考教程与材料:http://www.cis.syr.edu/~wedu/seed/Labs_12.04/Software/Buffer_Overflow/ (本 ...
- 20191310Lee_yellow缓冲区溢出实验
缓冲区溢出实验 1.什么是缓冲区溢出 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况.这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段.这一漏洞的出现是由于数据 ...
- SEED缓冲区溢出实验笔记——Return_to_libc
参考:http://www.cis.syr.edu/~wedu/seed/Labs_12.04/Software/Return_to_libc/ http://drops.wooyun.org/ ...
随机推荐
- 什么是xss攻击
概述: XSS攻击是Web攻击中最常见的攻击方法之一,它是通过对网页注入可执行代码且成功地被浏览器 执行,达到攻击的目的,形成了一次有效XSS攻击,一旦攻击成功,它可以获取用户的联系人列 表,然后向联 ...
- 负载均衡和故障转换(Failover)的连接RAC方法
TAF:Transparent Application Failover,透明的应用切换,即在切换的过程中,用户感知不到.可以实现会话的切换(无法实现事务的切换,即没有提交的事务会回滚),即在不断开连 ...
- SAP中使用FTP服务
SAP中简单的FTP技术实现基本上如下几个步骤: 1.SM59建立FTP的RFC destination. 可以通过执行SAP的标准程序RSFTP005,自动创建两个名为SAPFTP何SAPFTPA的 ...
- 命令模式与go-redis command设计
目录 一.什么是命令(Command)模式 二.go-redis command相关代码 三.总结 一.什么是命令(Command)模式 命令模式是行为型设计模式的一种,其目的是将一个请求封装为一个对 ...
- Nginx架构赏析
淘宝的某位大佬曾经做过测试,在一台24G内存的机器上,Nginx的最大并发连接数达到了200万.同学们听到这个结论后,是不是被Nginx的超高性能深深折服了,它内部的架构设计究竟是怎么样的呢?这篇文章 ...
- SQL 语法速成手册
本文针对关系型数据库的一般语法.限于篇幅,本文侧重说明用法,不会展开讲解特性.原理. 一.基本概念 数据库术语 数据库(database) - 保存有组织的数据的容器(通常是一个文件或一组文件). 数 ...
- 转 10 jmeter之动态关联
10 jmeter之动态关联 jmeter中关联是通过之前请求的后置处理器实现的,具体有两种方式:XPath Extractor(一般xml的时候用的多)和正则表达式提取器. 以webtours登 ...
- NAT模式、路由模式、桥接模式的区别
NAT模式 NAT模式概述 NAT是"Network Address Translation"的缩写,中文意思是"网络地址转换",它允许一个整体机构以一个公用I ...
- Quartz 定时任务调度
一.在Quartz.NET中quartz.properties的配置文件,忽略不修改,考虑下面: var props = new NameValueCollection { { "quart ...
- Web漏洞扫描-AppScan
Web漏洞扫描-AppScan 一.AppScan简述 二.功能及特点 一.AppScan简述 IBM Security AppScan是一个适合安全专家的Web应用程序和Web服务渗透测试解决方案. ...