我下面所讲的沙盒是指在Windows上构造一个和外界绝缘的空间来禁止用户行为的一种技术手段。在沙盒中的进程不能通过标准的Windows APIs读写文件,也不能通过socket等通信方式于其他进程进行信息交流,导致沙盒外面的信息进入不了,沙盒内的信息出不去。
我既不从事软件安全,也不从事什么黑客技术的研究,所以我在很长一段时间里不知道何为Sandbox,更别提如何跳出它。直到两三周之前,我想从Chrome中fprintf一些信息,却发现没有任何结果,所以就我开始踏上跳出沙盒之旅。
跳出沙盒阶段1 —— 阅读Chrome source code
我在github上找到了Chrome的source code,看到它对Nt读写函数进行了Hook,除此之外没有发现其他限制行为了,我暗想Chrome的安全做的太差了吧(但后来证实我想错了,难道Chrome有未开源的代码?)。我没有细读Chrome Hook的代码,我想通过测试代码更快的知道它的工作原理。
跳出沙盒阶段2 —— 试验
1)如果Chrome的Hook只是修改了输入地址表,那么这种技术有一个无法克服的缺陷。因为该Hook只是替换了函数地址,而Hook程序段是在全局变量构造的时候被执行的,这在程序的生命周期看来已经是后面的事情了,我们可以在全局变量被执行之前植入DLL来记住被Hook的原始地址,也就是记住读写文件的NT函数的地址,下次用这些地址进行读写。但是我的测试代码并没有通过,Chrome显然没有使用这个技术。
2)如果它是修改了函数入口的指令,那么我可以载入一个新的ntdll_new.dll,利用这个DLL直接跳转到Kernel,这样就可以