【转】http://www.cnblogs.com/Ox9A82/p/5429099.html

linux最早的漏洞防护机制nx-stack刚刚出现后就有人想出了突破方法。那就是只有栈是不可执行,而除了栈以外的其他地方还是可以执行的,只要把返回地址执行别的地方就可以。

一.格式化字符串漏洞

格式化字符串漏洞在Windows下很难以利用,但是在Linux下的pwn题目中出现的频率是很高的。

格式化字符串的“$”操作符,其允许我们从格式化字符串中选取一个作为特定的参数。例如,

printf("%3$s", 1, "b", "c", 4);

最终会显示结果“c”。这是因为格式化字符串“%3$s”,它告诉计算机“把格式化字符串后面的第三个参数告诉我,然后将参数解释为字符串”。所以,我们也可以这样做

printf("AAAA%3$n");

printf函数将值“4”(输入的A的数量)写入第三个参数指向的地址。

格式化字符串还有%s参数。那么,如果在栈中保存有指向我们感兴趣数据的指针,我们就可以在打印指针的时候使用一个%s来打印别的地方的内容。而且一般的程序都会将用户输入的数据储存在栈上。这就给了我们一个构造指针的机会,再结合格式化字符串漏洞,几乎可以得到所有内存数据

%n功能是将%n之前printf已经打印的字符个数赋值给传入的指针。通过%n我们就可以修改内存中的值了。和%sleak内存一样,只要栈中有我们需要修改的内存的地址就可以使用格式化字符串的漏洞修改它。

当然,如果需要修改的数据是相当大的数值时,我们可以使用%02333d这种形式。在打印数值右侧用0补齐不足位数的方式来补齐足。

可以看出,格式化字符串可以修改的内存范围更加广。只要构造出指针,就可以改写内存中的任何数值。和栈溢出的地毯轰炸不同。这种一次只能改写一个dword大小的内存的***方式更加精准而致命。

由此可见格式化字符串漏洞主要是:

1.泄漏任意地址的值,leak内存(比如leak出libc基地址)

2.写任意地址,可用于修改got表

主要实现方式是利用格式化串本身也处于栈中,去用直接参数访问找到这个栈中的格式化串。这个格式化串可以使用一个要写入的内存地址。也就是直接参数访问+%n格式符+长度表示=向任意地址写入值,这个写入是不能一次写入4字节的,所以可以分两次写入2字节和分四次写入1字节。其中hhn是写一个字节,hn是写两个字节。n是写四个字节。

附送栗子一枚:http://www.cnblogs.com/Ox9A82/p/5483916.html

这部分来自icemakr的博客32位读'%{}$x'.format(index)           // 读4个字节
'%{}$p'.format(index)           // 同上面
'${}$s'.format(index)
写'%{}$n'.format(index)           // 解引用,写入四个字节
'%{}$hn'.format(index)          // 解引用,写入两个字节
'%{}$hhn'.format(index)         // 解引用,写入一个字节
'%{}$lln'.format(index)         // 解引用,写入八个字节
64位读'%{}$x'.format(index, num)      // 读4个字节
'%{}$lx'.format(index, num)     // 读8个字节
'%{}$p'.format(index)           // 读8个字节
'${}$s'.format(index)
写'%{}$n'.format(index)           // 解引用,写入四个字节
'%{}$hn'.format(index)          // 解引用,写入两个字节
'%{}$hhn'.format(index)         // 解引用,写入一个字节
'%{}$lln'.format(index)         // 解引用,写入八个字节
%1$lx: RSI
%2$lx: RDX
%3$lx: RCX
%4$lx: R8
%5$lx: R9
%6$lx: 栈上的第一个QWORD

其它

这里记录一些相关的姿势

fmtstr_payload是pwntools提供的函数,用于自动生成格式化字符串。

fmtstr_payload有两个参数
第一个参数是int,用于表示取参数的偏移个数

第二个参数是字典,字典的意义是往key的地址,写入value的值

fmtstr_payload(7, {printf_got: system_add})

这个函数调用会往printf_got中写入system_add

此外调用一次fsb函数并不意味着只能进行一次写操作,实际上可以传递多个写格式串以实现一次调用对多个地址写的操作,注意写入的值是“之前”输入的字符总数。

转载于:https://blog.51cto.com/duallay/1909336

Linux下的格式化字符串漏洞利用姿势相关推荐

  1. 格式化字符串漏洞利用时计算的偏移到底是什么?

    格式化字符串漏洞利用时计算的偏移到底是什么? 我们平时在自己做题或者是看大佬们的wp时都会看见这种说法 说法一: 说法二: 相信有不少半路出家的小白都和我一样都只是知其然不知其所以然,那这里所说的&q ...

  2. (Buuctf) [第五空间2019 决赛]PWN5 简单格式化字符串漏洞利用

    这题是个基本格式化字符串漏洞利用; 满足if条件即可得到答案; 使 nptr 与 dword_804C044 相等即可; 可以使我们利用的是 第一次的输入输出; addr=0x804C044 payl ...

  3. linux获取字符格式化,Linux 格式化字符串漏洞利用

    目的是接觸一些常見的漏洞,增加自己的視野.格式化字符串危害最大的就兩點,一點是leak memory,一點就是可以在內存中寫入數據,簡單來說就是格式化字符串可以進行內存地址的讀寫.下面結合着自己的學習 ...

  4. 格式化字符串漏洞利用 六、特殊案例

    六.特殊案例 原文:Exploiting Format String Vulnerabilities 作者:scut@team-teso.net 译者:飞龙 日期:2001.9.1 版本:v1.2 有 ...

  5. 格式化字符串漏洞利用 一、引言

    一.引言 原文:Exploiting Format String Vulnerabilities 作者:scut@team-teso.net 译者:飞龙 日期:2001.9.1 版本:v1.2 这篇文 ...

  6. 格式化字符串漏洞利用 三、格式化字符串漏洞

    三.格式化字符串漏洞 原文:Exploiting Format String Vulnerabilities 作者:scut@team-teso.net 译者:飞龙 日期:2001.9.1 版本:v1 ...

  7. 格式化字符串漏洞利用

    学习资料: https://ctf-wiki.github.io/ctf-wiki/pwn/linux/fmtstr/fmtstr_exploit/                        ht ...

  8. 格式化字符串漏洞利用 五、爆破

    五.爆破 原文:Exploiting Format String Vulnerabilities 作者:scut@team-teso.net 译者:飞龙 日期:2001.9.1 版本:v1.2 当利用 ...

  9. 格式化字符串漏洞利用 七、工具

    七.工具 原文:Exploiting Format String Vulnerabilities 作者:scut@team-teso.net 译者:飞龙 日期:2001.9.1 版本:v1.2 一旦利 ...

最新文章

  1. ​防火墙(一)主机型防火墙
  2. 数据库--悲观锁【收藏,待尝试】
  3. 如何表示数组所有数都不等于一个数_每日算法系列【LeetCode 523】连续的子数组和...
  4. 使用 Node.js Express 的最佳实践
  5. es6 原生构造函数的继承
  6. python的csv标准库,Python标准库: csv模块——CSV文件的读写
  7. three.js场景中看不到模型/看不到阴影
  8. 他山之石 可以攻玉-《海量数据库解决方案I》
  9. mapred linuxtaskcontroller目录权限问题探究
  10. Kibana将语言设置为中文
  11. 12个超炫数据可视化工具_Python奇淫技巧,5个炫酷的数据可视化工具
  12. 飞秋(FeiQ)常用问题解答,
  13. lol服务器维护2021,英雄联盟客户端清理:2021进度与后续计划
  14. 使用cmd命令查看占用进程并结束进程
  15. 微信电脑版关掉截屏快捷键
  16. shel中的if-else语句
  17. android坐标计算器,函数科学计算器算坐标
  18. pci规划的三个原则_PCI规划应遵循什么原则? - 51学通信网络课堂 - 通信人值得信赖的在线交流学习平台 - Powered By EduSoho...
  19. jmeter基础之保存响应数据到文件
  20. 【oracle工具】plsqldev美化规则文件详细解释(关键字大写,标识符小写等规则)

热门文章

  1. 基于Python的BPSK音频的波形和频谱
  2. [第五章] 领域模型
  3. 【Excle数据透视表】如何在数据透视表中使用合并单元格标志
  4. python—— 写入错误UnicodeEncodeError的解决办法
  5. c# 文件及目录操作类
  6. java实现ad域登陆验证
  7. [转]国内各大互联网公司相关技术站点2.0版 (集合腾讯、阿里、百度、搜狐、新浪、360等共49个)...
  8. (转)layoutSubviews总结
  9. 滑动门和翻转门实现的横竖双tab标签测试页面(附源码)
  10. 《LeetCode力扣练习》第121题 买卖股票的最佳时机 Java