DASCTF NOV 2022 WP
PWN
一开始看 heapmaster
去了,看了半天没打出来,然后快没时间了就只写了个签到题
签个到
程序分析
程序功能有点类似于一个菜单堆,第一次处理输入的函数存在 off by one
漏洞
菜单提供了两个功能,分别是 add
和 get
add
函数中,输入 size
后可以在 malloc
出来的指针上输入 size
个字节,若指针上前4个字节无内容则会将其赋值为 0x886
。 size
的值不能超过 0x10
,即正常情况下最多只能输入10个字节大小的 content
。然而,在输入 content
时调用的处理输入函数中,判断输入数据界限的条件为 <= size - 1
,所以当 size == 0
,即 (size - 1) == 0xffffffffffffffff
,可以绕过检查输入超出预期的内容导致堆溢出
get
函数中,会以输入的8个字节数据为key,遍历储存指针的数组。若当前下标对应指针上第5~13字节的数据等于输入的key,第1~9字节的数据等于 canary
,则会调用 backdoor
来 getshell
利用思路
利用一开始的 off by one
泄露 canary
, add
中的堆溢出将 canary
的值提前布置在 top_chunk
的 mem
上,再申请一个 chunk
,此时该 chunk
上的内容就是 canary
,可以绕过 add
中对指针前4字节是否为0的判断,然后在该指针的第5~13字节上的内容写入 canary
的后4个字节和4个 '\x00'
,这样在 get
中输入 canary
的后4个字节作为 key
在遍历到对应的指针时就可以同时满足两个 strncmp
的判断从而去调用 backdoor
函数
exp
1 | #!/usr/bin/python2 |
login
程序分析
main
函数这个位置有一条花指令需要patch掉
程序会对输入的数据进行序列化
利用思路
洞在这个位置
set_sys_adm
函数会将输入数据继续序列化,然后调用 sprintf
函数将两个序列化后的数据格式化输出到函数内的一个数组上,并且以这个数组作为参数调用 system
函数
因为输入的数据是可控的,序列化后的数据是由输入的数据控制的,所以可以在这里构造出 system("/bin/sh")
的调用来 getshell
exp
1 | #!/usr/bin/python2 |