👹N1CTF junior
2024-3-5
| 2024-10-8
0  |  Read Time 0 min
type
status
date
slug
summary
tags
category
icon
password
36个小时的比赛,这个新生赛还是难,不愧是N1的入门赛。

File Manager

这个题和之前i春秋冬季赛那个堆一样,是一个思路。(可能还要简单一点)
打开文件之后
notion image
其实可以看出来,这是用这种命令行的方式,来进行了和堆一样的申请操作,touch就是平时的add指令,cat就是show,这样依次的带入就行。
接下来分别看看
notion image
在add功能中看到了strlen函数,要开始注意了,strlen函数是用来返回字符串不带\x00的长度的。所以说如果我们输入的是长度为0x10的字符串,它的长度其实是0x11
所以在进行strcpy 的时候,末尾1个byte会覆盖(*((void **)dest + 2) 这个指针,让它变成00(off-by-null)
💡
strlenstrcpy结合是一个比较经典的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系统调用:系统号0x28 sendfile(dest_fd, source_fd, &offset, count); 在本题中是: sendfile(1, 3, 0, 0x100);
 
  • CTF-WP
  • VNCTF 2024 复现2023年终总结
    • Giscus
    • Cusdis
    Catalog