攻防世界 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就不能利用格式化字符串了,不过这个题好像也没有明显的格式化字符串漏

攻防世界 time_formatter_第1张图片
还是像一个小系统一样的题

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

攻防世界 time_formatter_第3张图片
第二个选项输入时间,fgets_int函数是吧输入的字符转为整型

攻防世界 time_formatter_第4张图片
第三个选项设置时区,同样是先获取再malloc

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

攻防世界 time_formatter_第6张图片这个函数是退出,但是在退出之前就free了,所以用它free不退出

再说一下这个命令
攻防世界 time_formatter_第7张图片
@后面是要转换的时间,,后面引号里的是附加参数,,这里可以看到直接写;/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

攻防世界 time_formatter_第8张图片

你可能感兴趣的:(攻防世界 time_formatter)