场景:
buu 刷到20题, 使用了ret2lib拿到了flag
但是网上的解法都是写webshell,那就写一个试试水
总所周知:地址随机化,或者说模块的重定位 这里说的模块 包括dll,so,sys,可执行文件等
只要这个文件中有重定位表,即可进行地址随机化,同时意味着如果没有基址,就无法调用的正确的函数,直接crash
让我们再来看看call jmp,取全局变量等操作 要么是使用了相对偏移,要么使用了绝对地址
相对偏移在 任何情况下,针对自身模块的操作总是正确的 //不扩展开讲了
绝对地址 只有在模块加载到固定位置才能正常运行
让我们看看正常的实验环境
地址随机化开了
写入的shellcode虽然空间上是某个模块内(一般是可执行文件) 但是我们不知道任何地址的情况下,也用不了相对地址
考虑一下极端情况,当可执行文件自身也进行地址随机,由于不知道基址, got 表 ,plt表等也使用不了
那么就没有什么东西是随机不了的吗
存在的,比如说 gdt 由于gdt表的基址存在gdtr中 ,所以地址随机化对齐无效 ,当然3环情况下gdt也不好使
但是和gdt类似的还是存在的 ,比如说 tr 寄存器 idtr 中断表寄存器等
那么中断能做什么,确切来说,中断一般是从3环到0环,idt[index] 里能找到入口点
大部分重要函数最后都是要通过中断门,