1.测试代码

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>int init_func(){setvbuf(stdin, 0, 2, 0);setvbuf(stdout, 0,2 ,0);setvbuf(stderr, 0, 2, 0);return 0;
}int dofunc(){char buf2[0x8];char buf[0x8] = {};int *p;buf[0] = 0x61;buf[1] = 0x62;buf[2] = 0x63;buf[3] = 0x64;buf[4] = 0x65;buf[5] = 0x66;buf[6] = 0x67;buf[7] = 0x68;strcpy(buf2, "deadbeef");printf("buf_str is %s\n", buf);printf("buf_addr_p is %p\n", buf);printf("buf_addr_x is %x\n", buf);printf("buf[0]_d is %d\n", buf[0]);printf("buf[0]_10d is %10d\n", buf[0]);printf("buf[0]_c is %c\n", buf[0]);printf("buf[0]_10c is %10c\n", buf[0]);printf("buf_str is %s\n", p);printf("buf_addr is %p\n", p);printf("buf_addr_p is %p,next %p,next %p,next %p,next %p,next %p,next %p,next %p,next %p\n", buf);return 0;
}int main(){init_func();dofunc();return 0;
}

2.格式化字符串

%[parameter][flags][field width][.precision][length]type

每一种 pattern 的含义请具体参考维基百科的格式化字符串 。以下几个 pattern 中的对应选择需要重点关注

parameter

  • n$,获取格式化字符串中的指定参数

flag

  • field width
    输出的最小宽度
  • precision
    输出的最大长度
  • length,输出的长度
    hh,输出一个字节
    h,输出一个双字节
  • type
type 符号
d/i 有符号整数
u 无符号整数
x/X 16 进制 unsigned int 。x 使用小写字母;X 使用大写字母。如果指定了精度,则输出的数字不足时在左侧补 0。默认精度为 1。精度为 0 且值为 0,则输出为空。
o 8 进制 unsigned int 。如果指定了精度,则输出的数字不足时在左侧补 0。默认精度为 1。精度为 0 且值为 0,则输出为空。
s 如果没有用 l 标志,输出 null 结尾字符串直到精度规定的上限;如果没有指定精度,则输出所有字节。如果用了 l 标志,则对应函数参数指向 wchar_t 型的数组,输出时把每个宽字符转化为多字节字符,相当于调用 wcrtomb 函数。
c 如果没有用 l 标志,把 int 参数转为 unsigned char 型输出;如果用了 l 标志,把 wint_t 参数转为包含两个元素的 wchart_t 数组,其中第一个元素包含要输出的字符,第二个元素为 null 宽字符。
p, void * 型,输出对应变量的值。printf(“%p”,a) 用地址的格式打印变量 a 的值,printf(“%p”, &a) 打印变量 a 所在的地址。
n 不输出字符,但是把已经成功输出的字符个数写入对应的整型指针参数所指的变量。
% '%'字面值,不接受任何 flags, width。

3.代码演示结果

┌──(kali㉿kali)-[~/Desktop/git/ctf-pwn/fmt_test1]
└─$ ./fmt_test1
buf_str is abcdefghdeadbeef
buf_addr_p is 0x7ffebf91a7c8
buf_addr_x is bf91a7c8
buf[0]_d is 97
buf[0]_10d is         97
buf[0]_c is a
buf[0]_10c is          a
buf_str is ���==/
buf_addr is 0x56039f67e100
buf_addr_p is 0x7ffebf91a7c8,next (nil),next (nil),next (nil),next 0x7ffebf91852c,next 0x56039f67e060,next 0x6867666564636261,next 0x6665656264616564,next 0x56039f67e100

3.修改源代码

    printf("buf_str is %s\n", buf);printf("buf_addr_p is %p\n", buf);printf("buf_addr_x is %x\n", buf);printf("buf[0]_d is %d\n", buf[0]);printf("buf[0]_10d is %10d\n", buf[0]);printf("buf[0]_c is %c\n", buf[0]);printf("buf[0]_10c is %10c\n", buf[0]);printf("buf_str is %s\n", p);printf("buf_addr is %p\n", p);printf("buf_addr_p is %p,next %10$p,next %p,next %p,next %p,next %p,next %p,next %p,next %p,next %p,next %p\n", buf);

4.测试结果

┌──(kali㉿kali)-[~/Desktop/git/ctf-pwn/fmt_test1]
└─$ ./fmt_test1
buf_str is abcdefghdeadbeef
buf_addr_p is 0x7ffef8963a08
buf_addr_x is f8963a08
buf[0]_d is 97
buf[0]_10d is         97
buf[0]_c is a
buf[0]_10c is          a
buf_str is ���==/
buf_addr is 0x557e18117100
buf_addr_p is 0x7ffef8963a08,next 0x7ffef8963a30,next (nil),next (nil),next (nil),next 0x7ffef896176c,next 0x557e18117060,next 0x6867666564636261,next 0x6665656264616564,next 0x557e18117100,next 0x7ffef8963a30

可以看到%10p的作用是直接打印第十个%p位置上的指针内容

5.gdb调试


格式化字符串调用参数在x64中的顺序:
rsi -> rdi -> rdx -> rcx -> r8 -> r9 -> stack
通过格式化字符串可以无限泄露栈上的数据

Pwn 学习 格式化字符串相关推荐

  1. BUUCTF(pwn)jarvisoj_fm --格式化字符串漏洞

    简单的格式化字符串漏洞题目 32位,开启了canary和nx保护 知道以上条件就可以计算偏移了 得到偏移为11 from pwn import *r=remote('node3.buuoj.cn',2 ...

  2. 某道Pwn(格式化字符串漏洞)

    格式化字符串漏洞近几年出现频率少了,但是一些 CTF 中还有涉及,就当玩玩好了. 首先看这一段代码,什么比赛的题我忘了: #include <stdio.h> int main(void) ...

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

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

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

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

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

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

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

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

  7. pwn 学习笔记 格式化串计算偏移量

    学习参照:https://ctf-wiki.github.io/ctf-wiki/pwn/fmtstr/fmtstr_exploit/ 利用%s泄露libc函数的got表内容 addr%k$s可以用来 ...

  8. 攻防世界(pwn)--Mary_Morton 利用格式化字符串+栈溢出破解Canary的保护机制

    ctf(pwn) canary保护机制讲解 与 破解方法介绍 程序执行流程 有三个选项,1是利用栈溢出,2是利用格式化字符串,3是退出;可连续输入多次; IDA分析 解题思路 程序存在canary保护 ...

  9. CTF(pwn)-格式化字符串漏洞讲解(二) --攻防世界CGfsb

    格式化字符串漏洞介绍: https://blog.csdn.net/weixin_45556441/article/details/114080930 一.分析 pwnme的地址为 0x804A068 ...

最新文章

  1. 不用任何数学方法,如何计算圆面积
  2. 派生类的友元与析构【C++继承】
  3. Html5+razor+jqmobile尝鲜
  4. 1970.1.1这个特殊时间
  5. 通过Playbook部署LAMP(5)
  6. Angular自学笔记(?)结构型指令
  7. InnerClass内部类
  8. 今天专攻POWERSHELL获取本机CPU,内存消耗
  9. CSS: div高度自动适应背景图片的高度 How to get div height to auto-adjust to background size?...
  10. (17)Node.js第三方模块
  11. .NET Framework 4.5的C#中的对话框消息
  12. 从IT的角度思考BIM(三):敏捷开发
  13. python base64加解密
  14. QT中如何实现Thread与GUI的主线程连通
  15. 完全免费的小程序制作教程
  16. 华为鸿蒙操作a股,来了!华为“鸿蒙” 这一次它会给A股带来哪些惊喜
  17. IT行业是吃青春饭的吗?
  18. 用于Android开发的免费类库和工具集合
  19. HTML设置格式化时间
  20. Oracle数据库文件

热门文章

  1. BZOJ1112: [POI2008]砖块Klo(洛谷P3466)
  2. 一例H3C AP与Win10笔记本网卡不兼容故障的处理
  3. 为生活在充满挑战的环境中的人设计
  4. 优思学院:考取六西格玛绿带认证有什么意义?
  5. (附源码)spring boot校园二手销售网站 毕业设计161417
  6. Tengine的使用与简单配置---随笔
  7. bezos it is always day one演讲摘录 George w bush leadership forum
  8. [iCloud]iCloud学习笔记--APP内启用iCloud及CloudKit Dashboard介绍
  9. 编写html网页文档有哪些方法 它们,网页设计 第2章 HTML基础与文字版面设计.ppt...
  10. 关于SM2算法工具的一点儿说明