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 |

