菜鸟PWN手进阶之格式化字符串

3 篇文章 1 订阅

一、格式化字符串相关函数

fprintf --prints to a FILE stream
printf  --prints to the 'stdout' stream

二、格式化字符串常见语法

(一)常见格式

%d-打印signed int
%u-打印unsigned int
%s-打印参数地址处的字符串
%x-打印hex形式的整数
%p-打印指针,即void*

(二)控制打印长度

%<正整数n>c 打印宽度为n的字符串(打印长度为n)
举例:

printf("%10c",0x41);
打印A,宽度为10,因此A前面会填充9个空格,打印效果如下:(*号代表空格)
*********A

(三)关于%n、%hn、%hhn

%n将当前已打印字符的个数(四字节)写入参数地址处
%hn写入2字节
%hhn写入1字节
举例:

printf("%10c%n",0x41,0x41414141);
打印9个空格加上1个A,所以会往0x41414141处写入104字节)
打印字符:*********A
printf("%1337c%hhn",0x41,0x804a000);
因为1337=0x539,往地址0x804a000处写入1字节0x39

(四)关于$符号

%<正整数n>$指定占位符对应第n个参数

例如%12$x,此处%x对应第12个参数

举例:print("0x%2$x:0x%1$x\n",0xdeadbeef,0xcafebabe);
当中的%2$x对应第二个参数,%1$x对应第一个参数
打印结果:0xcafebabe:0xdeadbeef

(五)参数不足的情况:

如果printf的参数不足,会发生什么:
会假设这些参数的存在,在对应的栈/寄存器上找到这些参数,并做打印出来,造成栈上的信息泄露
参数不足情况:
32位:函数调用时参数在栈:格式化字符可以泄漏栈上数据
64位:函数调用使用寄存器+栈:格式化字符可以泄漏特定寄存器和栈上的值

(六)漏洞形成原因

本身printf("%s",a)这是安全正确的写法,若有人偷懒写成printf(a),而且参数a用户还可以输入,这样导致用户可以规定字符串的格式。而printf函数比较傻用户输入%x,会去从栈上找值输出也就导致栈上的值泄露,利用%n向以栈上的值为位置写入当前输出的字符串的个数。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值