攻防世界 time_formatter

Arch:     amd64-64-little
RELRO:    Partial RELRO
Stack:    Canary found
NX:       NX enabled
PIE:      No PIE (0x400000)
FORTIFY:  Enabled

这里一看有个fortify,以前没见过这种防护机制,

(开启了FORTIFY_SOURCE对格式化字符串有两个影响:
1.包含%n的格式化字符串不能位于程序内存中的可写地址。
2.当使用位置参数时,必须使用范围内的所有参数。所以如果要使用%7$x,你必须同时使用1,2,3,4,5和6。)
–引自别人的博文

所以有这个fortify就不能利用格式化字符串了,不过这个题好像也没有明显的格式化字符串漏

在这里插入图片描述
还是像一个小系统一样的题

在这里插入图片描述
第一个选项时输入format字符串,然后malloc空间将其存下来
这里命名的gets_and_malloc时获取字符串并且malloc,,,Format_check函数是检查输入的字符串里边只能有这些字符:"%aAbBcCdDeFgGhHIjklmNnNpPrRsStTuUVwWxXyYzZ:-_/0^# "

在这里插入图片描述
第二个选项输入时间,fgets_int函数是吧输入的字符转为整型

在这里插入图片描述
第三个选项设置时区,同样是先获取再malloc

在这里插入图片描述
第四个选项就是输出时间,这里面比较乱
__snprintf_chk这个函数前三个参数,被写入的字符串,写入字符数,1(flag参数,越高代表防护等级越高),,后面是一串格式化字符串,按照格式化填充
setenv(“TZ”, value, 1);这个函数是把环境变量中的TZ这一项修改为value的值,也就是更改时区

在这里插入图片描述这个函数是退出,但是在退出之前就free了,所以用它free不退出

再说一下这个命令
在这里插入图片描述
@后面是要转换的时间,,后面引号里的是附加参数,,这里可以看到直接写;/bin/sh;就能成功
但是这里在格式化字符串外面加了单引号,所以要闭合单引号,加上分号也是为了分割命令,就和sql注入一

利用方法:uaf

  1. 先malloc一个format字符串,随便填几个字符
  2. 然后free它,( 这里并没有malloc timezone,不过经过百度,free()一个空指针是没事的)
  3. (此时fastbin里面存上了format的chunk,但是指针还有),然后选项3,malloc 那个timezone,这样写入timezone就是写入format了
  4. 别忘了要选项3设置一个时间,要不程序进行不下去
  5. 最后在选项4 print

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值