页次: 1
按照我的理解,JIT编译器将byte code翻译成native code,那么native code要存储在那里呢?我猜想不会在磁盘上,毕竟存储在磁盘上又需要载入内存太慢了,那就需要把机器码直接写入内存然后执行。shellcode应该也需要这个操作。
那么,如果操作系统不允许进程拥有一个同时可写可执行的内存页(带有gsecurity补丁的linux似乎就有这个特性?或者Windows似乎也可以开启DEP?),那这样的操作系统中JIT编译器和shellcode是如何工作的?是我对JIT和shellcode的理解有误,还是我错误的理解了gsecurity和Windows DEP?
@依云 @yw622
最近编辑记录 xtricman (2019-11-08 16:49:16)
反社会,精神极其不稳定,随时可能炸碎身边所有人
离线
cat /proc/$pid/maps
离线
cat /proc/$pid/maps
你别这样啊,好不容易决定问了。看这个有啥用啊,我也知道这个啊。
其实我是想问,是不是确实有操作系统禁止页面同时可写可执行。
如果确实有,那JIT和shellcode怎么在这样的操作系统上工作。
最近编辑记录 xtricman (2019-11-08 16:47:05)
反社会,精神极其不稳定,随时可能炸碎身边所有人
离线
我觉得在这样的系统上 JIT 大概是没法工作的 (
然而我们常用的系统并不是这样的, 你一般都可以主动申请一块可执行的内存
离线
依云 说:cat /proc/$pid/maps
你别这样啊,好不容易决定问了。看这个有啥用啊,我也知道这个啊。
其实我是想问,是不是确实有操作系统禁止页面同时可写可执行。
如果确实有,那JIT和shellcode怎么在这样的操作系统上工作。
r 读 w 写 x 执行 p 私有
是不是确实有操作系统禁止页面同时可写可执行
Intel CPU 支持 NX 特性,操作系统可以把指定区域的内存标记为不可执行,然后 CPU 就不会去执行了(会段错误)。
你在 /proc/$pid/maps 里看到的权限位(rwx),如果执行不被允许的操作,也是段错误。
JIT 嘛,要修改前先把内存的模式改成不可执行、可写,改好之后改回可执行、不可写。
最近编辑记录 依云 (2019-11-08 18:14:36)
离线
突然很好奇哈佛结构是怎么做jit的,难道说有可以写程序内存的指令吗
ecmascript是世界上最好的语言
离线
如果 enforce X^W 的話 JIT 係沒法工作的唷~
JVM 一般會通過 mprotect 同時 enable PAGEWRITE 和 PAGEEXEC 唷
离线
页次: 1