格式化字符串的漏洞利用
liebian365 2024-12-31 12:44 115 浏览 0 评论
格式化字符串漏洞是一类允许攻击者在任意内存地址执行读或者写操作的软件缺陷。本教程主要关注C编程程序以及对格式化字符串函数的利用。
在我们开始理解软件缺陷之前,我们必须得先知道什么是格式化字符串。一个格式化字符串也就是一个ASCII字符串,其包括了文本和格式参数。例如,
printf("My name is: %s", "nops");
该函数调用将返回字符串
My name is: nops
该printf函数的第一个参数就是格式化字符串,它主要是依靠一个用来告诉程序如何进行格式化输出的说明符。在C程序中我们有许多用来格式化字符串的说明符,在这些说明符后面我们可以填充我们的内容。记住,说明符的前缀总是“%”字符,另外说明符存在许多不同的数据类型,最常见的包括:
?
1
2
3
4
5
6%d - 十进制 - 输出十进制整数
%s - 字符串 - 从内存中读取字符串
%x - 十六进制 - 输出十六进制数
%c - 字符 - 输出字符
%p - 指针 - 指针地址
%n - 到目前为止所写的字符数
可能会存在格式化字符串漏洞的函数包括(但不局限于)fprintf, printf, sprintf, snprintf,等
该漏洞的存在主要是程序员对于用户的输入没有进行好过滤造成的,下面我们通过一个例子进行说明:
#include
int main(int argc, char * argv[])
{
char a[1024];
strcpy(a, argv[1]);
printf(a);
printf("\n");
}
这段代码将把接收到的字符串作为参数,创建一个1024字符串缓冲区,接着将字符串复制到缓冲区,最后调用两个printf函数格式化输出。在正常情况下编译并运行,程序获取到的第一个参数是可预期的(如果你关注过缓冲区溢出漏洞就十分清楚)。
3root@localhost:~/#gcc test.c -o test
root@localhost:~/# ./test blah
blah
但是如果我们仔细查看printf文档,我们了解到调用的第一个参数是一个特殊的格式化字符串说明符。在我们这个简单的测试代码中,我们可以看到argv[1]将作为参数传递给printf函数。所以,我们有用户提供(即黑客提供)的数据将被解释成格式化字符串,这是十分危险的。接下来我们就看看这类攻击的示例
root@localhost:~/# ./test %s
TERM_PROGRAM=Apple_Terminal
我们键入%s作为攻击参数,它就会爆出一些有关我们终端的信息。为何会这样?这是因为printf函数认为它将要打印下一个堆栈地址,便将数据理解成了字符串。这是因为我们将%s作为格式化字符串(在代码中它仅仅是一个变量),接下来我们在漏洞程序中添加更多的格式化字符串,看看会发生什么。
root@localhost:~/# ./test %s.%s
TERM_PROGRAM=Apple_Terminal.(null)
目前,我们添加了第二个格式化字符串参数,通过“.”进行分隔,下一个堆栈的值为null。为第二个参数增加null的值,我们获取到与之前相同的终端信息。这种攻击是在堆栈中直接读取值,堆栈中如果存储有密码,密钥等那就想当危险了。我们尝试使用这项技术读取更多的信息,程序会爆分段错误。
root@localhost:~/# ./test %s.%s.%s
Segmentation fault: 11
但是我们可以进一步利用该漏洞,将值压入堆栈中。为了更好理解的这个工作原理,我们必须搞清楚printf规范中的两个特性,"%n"可以用来存储到目前为止所写的字符数,在相应的参数中用整数来表明变量名。
int i;
printf("ABCDE%n", &i);
printf函数会将5(刚刚写入的字符数)写入i变量么?
我们需要了解的第二个特性便是“$”操作符,其允许我们从格式化字符串中选取一个作为特定的参数。例如,
printf("%3$s", 1, "b", "c", 4);
最终会显示结果“c”。这是因为格式化字符串“%3$s”,它告诉计算机“把格式化字符串后面第三个参数告诉我,然后将参数解释为字符串”。所以,我们也可以这样做
printf("AAA%3$n");
printf函数将值“3”(输入的A的数量)写入第三个参数指向的地址。等等,我们这里没有第三个参数啊!记住咯,printf会使用堆栈上连续的参数。不论怎样,printf都会将“3”写入堆栈中某一个地址中。
好吧,我个人觉得是很酷的。我们获取堆栈中泄漏的数据,以及一个不受控制的原始任意写(write-what-where)。为了利用这个漏洞执行代码我们可以控制写入的内容,我们可以控制在哪里写入内容。我们只能在堆栈中的任意位置进行写操作,并非万能的。在下一节内容中我们会讲到ShellCode的开发,并给我们这个BUG添加攻击载荷,让我们可以控制数据。
相关推荐
- 精品博文嵌入式6410中蓝牙的使用
-
BluetoothUSB适配器拥有一个BluetoothCSR芯片组,并使用USB传输器来传输HCI数据分组。因此,LinuxUSB层、BlueZUSB传输器驱动程序以及B...
- win10跟这台计算机连接的前一个usb设备工作不正常怎么办?
-
前几天小编闲来无事就跑到网站底下查看粉丝朋友给小编我留言询问的问题,还真的就给小编看到一个问题,那就是win10跟这台计算机连接的一个usb设备运行不正常怎么办,其实这个问题的解决方法时十分简单的,接...
- 制作成本上千元的键盘,厉害在哪?
-
这是稚晖君亲自写的开源资料!下方超长超详细教程预警!!全文导航:项目简介、项目原理说明、硬件说明、软件说明项目简介瀚文智能键盘是一把我为自己设计的——多功能、模块化机械键盘。键盘使用模块化设计。左侧的...
- E-Marker芯片,USB数据线的“性能中枢”?
-
根据线缆行业的研究数据,在2019年搭载Type-C接口的设备出货量已达到20亿台,其中80%的笔记本电脑和台式电脑采用Type-C接口,50%的智能手机和平板电脑也使用Type-C接口。我们都知道,...
- ZQWL-USBCANFD二次开发通讯协议V1.04
-
修订历史:1.功能介绍1.1型号说明本文档适用以下型号: ZQWL-CAN(FD)系列产品,USB通讯采用CDC类实现,可以在PC机上虚拟出一个串口,串口参数N,8,1格式,波特率可以根据需要设置(...
- win10系统无法识别usb设备怎么办(win10不能识别usb)
-
从驱动入手,那么win10系统无法识别usb设备怎么办呢?今天就为大家分享win10系统无法识别usb设备的解决方法。1、右键选择设备管理器,如图: 2、点击更新驱动程序,如图: 3、选择浏览...
- 微软七月Win8.1可选补丁有内涵,含大量修复
-
IT之家(www.ithome.com):微软七月Win8.1可选补丁有内涵,含大量修复昨日,微软如期为Win7、Win8.1发布7月份安全更新,累计为6枚安全补丁,分别修复总计29枚安全漏洞,其中2...
- 如何从零开始做一个 USB 键盘?(怎么制作usb)
-
分两种情况:1、做一个真正的USB键盘,这种设计基本上不涉及大量的软件编码。2、做一个模拟的USB键盘,实际上可以没有按键功能,这种的需要考虑大量的软件编码,实际上是一个单片机。第一种设计:买现成的U...
- 电脑识别U盘失败?5个实用小技巧,让你轻松搞定USB识别难题
-
电脑识别U盘失败?5个实用小技巧,让你轻松搞定USB识别难题注意:有些方法会清除USB设备里的数据,请谨慎操作,如果不想丢失数据,可以先连接到其他电脑,看能否将数据复制出来,或者用一些数据恢复软件去扫...
- 未知usb设备设备描述符请求失败怎么解决
-
出现未知daousb设备设备描述符请求失du败解决办zhi法如下:1、按下Windows+R打开【运行】;2、在版本运行的权限输入框中输入:services.msc按下回车键打开【服务】;2、在服务...
- 读《飘》47章20(飘每章概括)
-
AndAhwouldn'tleaveMissEllen'sgrandchildrenfornotrashystep-patobringup,never.Here,Ah...
- 英翻中 消失的过去 37(消失的英文怎么说?)
-
翻译(三十七):消失的过去/茱迪o皮考特VanishingActs/JodiPicoult”我能做什么?“直到听到了狄利亚轻柔的声音,我才意识到她已经在厨房里站了好一会儿了。当她说话的时候,...
- RabbitMQ 延迟消息实战(rabbitmq如何保证消息不被重复消费)
-
现实生活中有一些场景需要延迟或在特定时间发送消息,例如智能热水器需要30分钟后打开,未支付的订单或发送短信、电子邮件和推送通知下午2:00开始的促销活动。RabbitMQ本身没有直接支持延迟...
- Java对象拷贝原理剖析及最佳实践(java对象拷贝方法)
-
作者:宁海翔1前言对象拷贝,是我们在开发过程中,绕不开的过程,既存在于Po、Dto、Do、Vo各个表现层数据的转换,也存在于系统交互如序列化、反序列化。Java对象拷贝分为深拷贝和浅拷贝,目前常用的...
- 如何将 Qt 3D 渲染与 Qt Quick 2D 元素结合创建太阳系行星元素?
-
Qt组件推荐:QtitanRibbon:遵循MicrosoftRibbonUIParadigmforQt技术的RibbonUI组件,致力于为Windows、Linux和MacOSX提...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- wireshark怎么抓包 (75)
- qt sleep (64)
- cs1.6指令代码大全 (55)
- factory-method (60)
- sqlite3_bind_blob (52)
- hibernate update (63)
- c++ base64 (70)
- nc 命令 (52)
- wm_close (51)
- epollin (51)
- sqlca.sqlcode (57)
- lua ipairs (60)
- tv_usec (64)
- 命令行进入文件夹 (53)
- postgresql array (57)
- statfs函数 (57)
- .project文件 (54)
- lua require (56)
- for_each (67)
- c#工厂模式 (57)
- wxsqlite3 (66)
- dmesg -c (58)
- fopen参数 (53)
- tar -zxvf -c (55)
- 速递查询 (52)