[pwn]堆:Use After Free

Use After Free:time_formatter writeup

UAF漏洞就是Use After Free,再释放后继续使用,Use After Free会引发各种奇怪的现象,根据场景的不同并没有一种统一的利用方式。下面看题目:time_formatter

日常惯例,先查看安全策略:
[pwn]堆:Use After Free_第1张图片
开启了canary、NX、ASLR,然后查看一下程序逻辑:
[pwn]堆:Use After Free_第2张图片
很常见的堆菜单,下面查看一下各种功能:
[pwn]堆:Use After Free_第3张图片
setformat的功能,首先是输入一个字符串并为它申请空间然后将全局变量ptr指向这个空间,函数中使用了strdup函数,这个函数的功能是将字符串拷贝到malloc的位置:
在这里插入图片描述
然后是filter函数(都是我改的名字),filter函数检测是否有规定范围外的字符,有的话就失败,重新来:
[pwn]堆:Use After Free_第4张图片
接下来是settime函数,就是输入一个数字,然后用一个全局变量保存它:
[pwn]堆:Use After Free_第5张图片
然后是setzone函数,直接读入一个字符串并为它申请空间,并使用一个全局变量保存它,但没有filter函数的检验
[pwn]堆:Use After Free_第6张图片
然后是printtime函数:
[pwn]堆:Use After Free_第7张图片
可见之前输入的format会被拼接入命令之中,存在命令注入,但setformat函数有filter检验,无法输入;,|等注入的字符。

接着往下看,exit函数:
[pwn]堆:Use After Free_第8张图片
exit函数中先将ptr和value两个全局变量指向的地址free掉,free掉之后也没有将悬挂指针清空,然后询问是否要退出,选否还可以继续玩,还有这种操作?所以这里存在UAF漏洞,但却没有double free,因为每次重新申请都会自动将指针指向新的空间,指针数量也不够double free+unlink利用。

利用思路:

先用setformat申请一段空间让ptr指向它,什么内容都行:
[pwn]堆:Use After Free_第9张图片
然后调用exit free掉这段空间,但ptr的指向并没有变,但不真正退出,选择n:
[pwn]堆:Use After Free_第10张图片
然后调用没有输入校验的setzone函数输入命令注入语句’;/bin/sh #(这里单引号是截断之前的单引号,类似sql注入:
[pwn]堆:Use After Free_第11张图片
那么现在ptr就指向命令注入的语句了,成功绕过了检测,然后调用printtime函数就能getshell,都不用写exp,直接手工操作就行,操作顺序如下:

  1. 输入1,选择set format

  2. 输入回车,什么也不输入

  3. 输入5,退出

  4. 输入n,不真的退出

  5. 输入3,选择set zone

  6. 输入’;/bin/sh # ,然后回车确定

  7. 输入4,选择print time

  8. 获得shell:
    [pwn]堆:Use After Free_第12张图片

你可能感兴趣的:(二进制)