updated:

2020网鼎杯pwn1杂思


网鼎杯一天0输出,唯一一道有机会做出的pwn题也因为我固执的想法没有解出来。赛后看了大佬的exp也还是一头雾水,虽然知道这么做确实可以getshell,然而疑问还是有很多。
问题被解决的根本原因在于这样一个规律:

在本题中,当本地和远程的libc版本相同时,内存地址空间布局也一定相同。

然而这个依据在现在的我看来毫无道理,因为ASLR是由内核实现的。然而实践又证明了它的正确性。由这个问题,我又想到了一些可能与之有关的问题。这里记录一下,留给以后的自己回答。

  1. ASLR在内核中是如何实现的,其分配规律究竟是受哪些因素影响?ASLR后程序的地址空间有什么规律吗
  2. ASLR是在什么时候进行的?
  3. 内核,ld,libc在一个程序的生命周期中(从命令行键入命令到程序退出)究竟有着怎样的作用?
  4. mmap的结果受哪些因素的影响,它遵循怎样的分配原则,是最佳适配原则吗?
  5. 虚拟地址空间和实实在在的文件之间的映射关系是怎样的?程序刚开始时libc并没有被映射到虚拟地址空间,这时libc的基地址已经被ASLR机制确定了吗?
  6. ASLR会在父子进程之间传递,这可以由clone或者fork造成。这意味着什么?,见这篇文章:https://www.ndss-symposium.org/images/2017/09/how-make-aslr-win-clone-wars-runtime-re-randomization.pdf。注意虽然clone会导致ASLR的传递,但execve一个elf文件会再次触发ASLR。
  7. ELF文件映射到虚拟地址空间中时,允许其所占据的内存不连续吗?

这次比赛教训相当深刻,下次做题第一件事就是泄露libc,patchelf,保证本地libc和远程一致。再遇到问题多多调试,再也不凭着仅有的一点知识纸上谈兵了=-=


← Prev WHUCTF-2020 WriteUp | 堆的理论基础 Next →