您尚未登录。

#1 2019-11-08 16:15:18

xtricman
エクス·トリクマン
注册时间: 2012-12-26
帖子: 1,267

JIT编译器与shellcode

按照我的理解,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)


反社会,精神极其不稳定,随时可能炸碎身边所有人

离线

#2 2019-11-08 16:39:29

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,960
个人网站

Re: JIT编译器与shellcode

cat /proc/$pid/maps

离线

#3 2019-11-08 16:44:30

xtricman
エクス·トリクマン
注册时间: 2012-12-26
帖子: 1,267

Re: JIT编译器与shellcode

依云 说:

cat /proc/$pid/maps

你别这样啊,好不容易决定问了。看这个有啥用啊,我也知道这个啊。
其实我是想问,是不是确实有操作系统禁止页面同时可写可执行。
如果确实有,那JIT和shellcode怎么在这样的操作系统上工作。

最近编辑记录 xtricman (2019-11-08 16:47:05)


反社会,精神极其不稳定,随时可能炸碎身边所有人

离线

#4 2019-11-08 17:05:21

aloxaf
会员
注册时间: 2019-11-08
帖子: 1

Re: JIT编译器与shellcode

我觉得在这样的系统上 JIT 大概是没法工作的 (

然而我们常用的系统并不是这样的, 你一般都可以主动申请一块可执行的内存

离线

#5 2019-11-08 18:13:23

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,960
个人网站

Re: JIT编译器与shellcode

xtricman 说:
依云 说:

cat /proc/$pid/maps

你别这样啊,好不容易决定问了。看这个有啥用啊,我也知道这个啊。
其实我是想问,是不是确实有操作系统禁止页面同时可写可执行。
如果确实有,那JIT和shellcode怎么在这样的操作系统上工作。

r 读 w 写 x 执行 p 私有

xtricman 说:

是不是确实有操作系统禁止页面同时可写可执行

Intel CPU 支持 NX 特性,操作系统可以把指定区域的内存标记为不可执行,然后 CPU 就不会去执行了(会段错误)。
你在 /proc/$pid/maps 里看到的权限位(rwx),如果执行不被允许的操作,也是段错误。

JIT 嘛,要修改前先把内存的模式改成不可执行、可写,改好之后改回可执行、不可写。

最近编辑记录 依云 (2019-11-08 18:14:36)

离线

#6 2019-11-09 02:38:05

yw662
大会员
所在地: localhost
注册时间: 2018-10-10
帖子: 424

Re: JIT编译器与shellcode

突然很好奇哈佛结构是怎么做jit的,难道说有可以写程序内存的指令吗


ecmascript是世界上最好的语言

离线

#7 2019-12-14 00:39:52

Idiotist
会员
注册时间: 2019-12-11
帖子: 17

Re: JIT编译器与shellcode

如果 enforce X^W 的話 JIT 係沒法工作的唷~
JVM 一般會通過 mprotect 同時 enable PAGEWRITE 和 PAGEEXEC 唷

离线

页脚