type
status
date
slug
summary
tags
category
icon
password
36个小时的比赛,这个新生赛还是难,不愧是N1的入门赛。
File Manager
这个题和之前i春秋冬季赛那个堆一样,是一个思路。(可能还要简单一点)
打开文件之后
其实可以看出来,这是用这种命令行的方式,来进行了和堆一样的申请操作,touch就是平时的add指令,cat就是show,这样依次的带入就行。
接下来分别看看
在add功能中看到了
strlen
函数,要开始注意了,strlen
函数是用来返回字符串不带\x00
的长度的。所以说如果我们输入的是长度为0x10的字符串,它的长度其实是0x11所以在进行
strcpy
的时候,末尾1个byte会覆盖(*((void **)dest + 2)
这个指针,让它变成00(off-by-null)strlen
和strcpy
结合是一个比较经典的off-by-null漏洞可能会出现的地方,以后注意多多关注这样如果我们将后面
(*((void **)dest + 2)
覆盖了,然后这个\x00结尾的地址如果就是某一个file的chunk,我就可以修改另外的(*((void **)dest2 + 2)
地址了,这样更是就可以达成任意写的功能然后将
(*((void **)dest2 + 2)
的值写成edit的返回地址,这样我们刚刚进行edit结束,就可以通过返回进行ROP,从而拿到shell我的版本:
写的比较麻烦,因为是手动凑有没有正好指向某一个file_name对应的chunk为\x00结尾的。
在进行payload书写的时候注意:
- libc的地址是通过unsorted bin中的main_arena的地址获取的,这是通常来说的libc获取思路,到2.35为止都是可以的
- 在想要将chunk放入unsorted bin的时候注意不能让这个chunk和top chunk靠在一起,不然会直接free进top chunk
这里有一个其他师傅的版本:
思路其实是一样的,只是实现起来更加的简约
- 他首先申请了一个很大的malloc,然后申请了一个较小的,这样就可以手动来进行地址的调整,让其对应\x00的末尾地址
- 他使用了sendfile系统调用,这个比orw在系统实现层面更加的快捷,同时,在沙箱如果禁用了read和write函数的时候可以进行使用
sendfile系统调用:系统号0x28sendfile(dest_fd, source_fd, &offset, count);
在本题中是:sendfile(1, 3, 0, 0x100);