updated:
2020网鼎杯pwn1杂思
网鼎杯一天0输出,唯一一道有机会做出的pwn题也因为我固执的想法没有解出来。赛后看了大佬的exp也还是一头雾水,虽然知道这么做确实可以getshell,然而疑问还是有很多。
问题被解决的根本原因在于这样一个规律:
在本题中,当本地和远程的libc版本相同时,内存地址空间布局也一定相同。
然而这个依据在现在的我看来毫无道理,因为ASLR是由内核实现的。然而实践又证明了它的正确性。由这个问题,我又想到了一些可能与之有关的问题。这里记录一下,留给以后的自己回答。
- ASLR在内核中是如何实现的,其分配规律究竟是受哪些因素影响?ASLR后程序的地址空间有什么规律吗
- ASLR是在什么时候进行的?
- 内核,ld,libc在一个程序的生命周期中(从命令行键入命令到程序退出)究竟有着怎样的作用?
- mmap的结果受哪些因素的影响,它遵循怎样的分配原则,是最佳适配原则吗?
- 虚拟地址空间和实实在在的文件之间的映射关系是怎样的?程序刚开始时libc并没有被映射到虚拟地址空间,这时libc的基地址已经被ASLR机制确定了吗?
- 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。
- ELF文件映射到虚拟地址空间中时,允许其所占据的内存不连续吗?
这次比赛教训相当深刻,下次做题第一件事就是泄露libc,patchelf,保证本地libc和远程一致。再遇到问题多多调试,再也不凭着仅有的一点知识纸上谈兵了=-=