前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PWN-格式化字符串漏洞

PWN-格式化字符串漏洞

作者头像
ly0n
发布2020-11-04 10:58:00
7270
发布2020-11-04 10:58:00
举报
文章被收录于专栏:ly0n

关于格式化字符串

格式化字符串函数:

就是将计算机内存中的表示的数据转化为人眼可以识别的字符串类型。

以打印函数printf()为例

代码语言:javascript
复制
printf("color %s,numbre %d,float %4.2f","blue",1234,1.13)

%d - 十进制 - 输出十进制整数 %s - 字符串 - 从内存中读取字符串 %x - 十六进制 - 输出十六进制数 %c - 字符 - 输出字符 %p - 指针 - 指针地址 %n - 到目前为止所写的字符数

这样应该就好理解一点,printf()函数在被调用时会在根据传参顺序来进行调用,这一点在上图就已经很明显的可以看出来了,但是会一个字符一个字符的去读取,就会遇到无法读取的情况:

当前字符不是%直接输出 当前字符时%:

  • 如果紧接着没有字符,那么运行就会报错
  • 如果下一个字符是%,则输出%
  • 如果是上面提到的相应字符,就会获取相应的参数,对其进行解析并输出

这样一来,如果只有一个占位符后面却没有跟参数时,%s就会从读取一个数字并作为地址,如果这个地址是无效的时候,就会导致程序崩溃,也就是我们说的格式化字符串漏洞。

漏洞原理利用

程序崩溃

​ 这种利用方式就和我们上面说的一样,通过输入很多的%s来让程序崩溃。对于每一个 %sprintf() 都会从栈上取一个数字,把该数字视为地址,然后打印出该地址指向的内存内容,由于不可能获取的每一个数字都是地址,所以数字对应的内容可能不存在,或者这个地址是被保护的,那么便会使程序崩溃。

在 Linux 中,存取无效的指针会引起进程收到 SIGSEGV 信号,从而使程序非正常终止并产生核心转储

泄露内存

​ 一段C代码来具体看一下

代码语言:javascript
复制
#include <stdio.h>
int main() {
  char s[100];
  int a = 1, b = 0x22222222, c = -1;
  scanf("%s", s);
  printf("%08x.%08x.%08x.%s\n", a, b, c, s);
  printf(s);
  return 0;
}

p1师傅提醒编译的时候记得-w关闭异常检查

代码语言:javascript
复制
gcc -m32 -w  -fno-stack-protector -no-pie -o fs1 1.c

然后就开始使用Pwndbgprintf下个断点,然后运行,输入 %08x.%08x.%08x

然后接着看下栈空间。

我们可以来看下程序的执行,第一个框里的红色是printf函数的返回地址,紧接着是printf的第一个参数,后面printf会根据这个字符串来解析后面的参数。

第一个%08x解析的是 0x1也就是源程序里的a,第二个%08x解析的是0x22222222 第三个%08x解析的是0xffffffff也就是参数-1最后的%s会把我们输入的参数打印出来。

我们再让程序执行一次

发现程序把我们第一次传入的参数%08x.%08x.%08x打印了出来,但是再次执行程序时,发现程序断在了第二个printf,把我们之前输入的参数作为 格式化字符串,但是这一次没有其他的参数,但是他同样会在栈上找临近的三个参数,然后按照顺序给他们打印出来,这样就把他后面三个栈上的值给输出出来了。

上边的方法是依次获得栈中的值,我们可以用%n$x来获得n+1的值

代码语言:javascript
复制
%n:令printf把自己到该点已打出的字符总数放到相应变元指向的整形变量中

这里我输入了%3$x也就是会打印出第四个参数对应的值。

gdb调程序运行两次后发现第四个参数的值。

我们也可以通过%$s 来获取栈变量对应的字符串

总结

  • 利用 %x 来获取对应栈的内存,但建议使用 %p,可以不用考虑位数的区别
  • 利用 %s 来获取变量所对应地址的内容,只不过有零截断
  • 利用 %nx 来获取指定参数的值,利用 %ns 来获取指定参数对应地址的内容

参考链接:

p1师傅

宸机师傅

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-06-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 关于格式化字符串
  • 漏洞原理利用
    • 程序崩溃
      • 泄露内存
      • 总结
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档