文章预览
夕阳下的舞者(off by null) https://www.polarctf.com/#/page/challenges 困难题,2.23,保护全开。先看add() sub_B34()中限制了8个chunk。先创建0x20的chunk作为struct(结构体),然后输入size存储在v2并malloc(v2),接着malloc(0x80),malloc(0x20),最后向malloc(v2)和malloc(0x20)写值,也就是name和mark。 也就是说v2这个struct构成大概是这样的。 size malloc(v2) #name malloc(0x20) #mark malloc(0x80) #esg gdb上更直观,add(0x20)的heap如下。 其中有个问题就是malloc(0x80) #esg并没有写值,以及sub_B74是封装了个read,实际上是个off by null。 read都很熟悉,a2是a1的size,a1[a2]就是a1的边界的下一个字节,*result & = 0xFEu;则是按位与操作,由于0xFE的二进制是1111 1110,所以结果就是清零。 那么这次add(0x18),可以发现PREV_INUSE位被清零了。 再看delete() 可以发现free一个清一个指针,但唯独chunklist[v1] + 24并没有清空,也就是malloc(
………………………………