问题标签 [dynamic-execution]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 将运算符作为函数传递以与 Pandas 数据帧一起使用
我正在根据阈值从系列中选择数据。
我想在最后一行代码中使用 ops[cfg['op']],而不是 '<'。如果需要,我愿意更改 ops dict 的 key 和值(例如 -lt 而不是 <)。如何做到这一点?
javascript - 如何动态执行/评估包含 ES6 模块/需要一些依赖项的 JavaScript 代码?
我希望我的用户能够在我的 JavaScript 应用程序中使用 JavaScript 作为脚本语言。为此,我需要动态执行源代码。
动态执行 JavaScript 似乎有两个主要选项:
a) 使用eval(...)
方法(或var func = new Function(...);
)。
b)<script>
向 DOM 添加一个节点(例如使用$('body').append(...)
)。
只要我不在import
动态执行的源代码中使用任何语句,这两种方法都可以正常工作。如果我包含import
语句,我会收到错误消息Unexpected identifier
。
要执行的示例用户源代码:
示例应用程序代码来说明该动态代码的可能用法:
a) 使用评估
b) 使用 DOM 修改:
type="application/javascript"
如果我没有为选项 b) 指定脚本类型或使用,我会收到Unexpected identifier
错误消息。如果我使用type="module"
我不会出错。脚本标签成功添加到 DOM,但模块代码没有执行。
我首先认为这可能是由于异步加载。但是,等到脚本标签的加载完成并不能使用type='module'
. 加载机制可以使用,type="application/javascript"
但是......再次......import
不起作用。
加载脚本标签后异步执行的示例代码:
--
如果我使用 对 index.html 中的用户源代码进行硬编码<source type="module">
,则会执行模块代码。动态加载模块代码似乎不起作用。我使用 Chrome 版本 63.0.3239.108。
<script type="module">
=> I.动态添加到 DOM 后如何强制执行标签?或者
=> 二。如何评估包含import
(可能还有导出)语句的脚本?或者
=> 三。允许用户源代码定义可以动态解析的依赖关系的好方法是什么?
相关问题和文章:
https://www.html5rocks.com/en/tutorials/security/sandboxed-iframes/#safely-sandboxing-eval
https://javascriptweblog.wordpress.com/2010/04/19/how-evil-is-eval/
进一步说明:
我知道使用示例的工作流程window.createTreeModel
并不理想。我在这里使用它是因为代码易于理解。在我设法以某种方式运行用户源代码(包括其依赖项)之后,我将改进我的所有工作流程并考虑诸如安全问题之类的问题。
expression - 使用通用表达式语言 (CEL) 在列表中查找值的示例
我正在遵循谷歌通用表达式语言规范,如果我能做这样的事情,有人可以指导我:
我需要使用 google CEL 编写一个表达式来查找“345”是否在 phone_numbers 列表中。
https://github.com/google/cel-spec/blob/master/doc/langdef.md#standard-definitions
c - 动态 C 代码执行:内存引用
tl; dr:我正在尝试从另一个片段中动态执行一些代码。但是我坚持处理内存引用(例如mov 40200b, %rdi
):我可以修补我的代码或运行代码的片段以便0x40200b
正确解析(作为200b
代码的偏移量)吗?
为了生成要动态执行的代码,我从一个(内核)对象开始,并使用 ld 解析引用。
然后我通过一个映射文件传输要执行的代码
我用这段代码动态地执行代码
这种方法适用于不访问内存的代码,例如"\x55\x48\x89\xe5\xc7\x45\xf8\x02\x00\x00\x00\xc7\x45\xfc\x03\x00\x00\x00\x8b\x55\xf8\x8b\x45\xfc\x01\xd0\x5d\xc3"
当涉及内存时我遇到问题。
请参见下面的示例。
假设我不想动态执行函数 vm_close。Objdump -d -S
返回:
在执行时,我的函数指针指向正确的代码:
但是,此代码将失败,因为:
1)在我的上下文中 $0x40200b 指向物理地址$0x40200b
,而不是offset 200b
从代码的开头。
2)我不明白为什么,但那里显示的地址实际上与正确的地址不同(0xffffc8ff818ec3de!= ffffffff810e73de)所以它不会指向我的符号并且会崩溃。
有没有办法解决我的两个问题?
另外,我很难找到与我的问题(低级内存分辨率)相关的好文档,如果你能给我一些,那真的对我有帮助。
编辑:由于我在内核中运行代码,我不能简单地用 gcc ( )-fPIC
或-fpie
不允许的代码编译代码cc1: error: code model kernel does not support PIC mode
编辑 24/09:
根据@Peter Cordes 的评论,我重新编译它添加mcmodel=small -fpie -mno-red-zone -mnosse
到 Makefile ( /lib/modules/$(uname -r)fixed/build/Makefile
) 这比原始版本更好,因为在链接之前生成的代码现在是:
因此,我现在可以访问脚本中的其他变量了……</p>
因此,链接后,我可以成功访问嵌入在缓冲区中的变量。
尽管如此,仍然存在一个问题:
我要访问的符号 ( printk
) 和我的可执行缓冲区位于不同的地址空间中,例如:
但是在我callq
的 to 中printk
,我只有 32 位来写入要调用的地址作为偏移量,$rip
因为内核中没有.got
部分。这意味着 printk必须位于[$rip-2GO, $rip+2GO]
. 但情况并非如此。
我是否有办法访问 printk 地址,尽管它们距离我的缓冲区超过 2GO(我尝试使用mcmodel=medium
但我没有看到生成的代码有任何区别),例如通过修改 gcc 选项以便二进制文件居然有.got
节?
或者是否有一种可靠的方法可以强制在(我目前使用)中分配我的可执行文件和可能对 kmalloc 而言太大的缓冲区[0xffffffff00000000 ; 0xffffffffffffffff] range?
__vmalloc(BUFFER_SIZE, GFP_KERNEL, PAGE_KERNEL_EXEC);
编辑 27/09:[0xffffffff00000000 ; 0xffffffffffffffff]
我使用非导出 __vmalloc_node_range
函数作为(脏)hack
成功地在范围内分配了我的缓冲区。
然后,当我知道我的可执行缓冲区的地址和内核符号的地址(通过解析)时,我可以使用's option where/proc/kallsyms
修补我的二进制文件。ld
--defsym symbol=relative_address
relative_address = symbol_address - buffer_offset
尽管非常肮脏,但这种方法确实有效。
但是我每次执行它时都需要重新链接我的二进制文件,因为缓冲区可能(并且将)分配在不同的地址。为了解决这个问题,我认为最好的方法是将我的可执行文件构建为一个真正的位置独立的可执行文件,这样我就可以修补全局偏移表而不是完全重新链接模块。
但是通过那里提供的选项,我得到了一个相对于 rip 的地址,但没有得到/plt。所以我想找到一种方法将我的模块构建为一个合适的 PIE。
这篇文章变得庞大而混乱,我们偏离了最初的问题。因此,我在那里打开了一个新的简化帖子。如果我得到有趣的答案,我会编辑这篇文章来解释它们。
注意:为简单起见,此处未显示安全测试
注 2:我非常清楚我的 PoC 非常不寻常,可能是一种不好的做法,但我还是想这样做。
c++ - 这是一个乱序执行案例吗?
考虑下面的代码。
如果我注释行,std::cout << sum << std::endl;
则执行时间将显示为零(或足够接近)。我已经在不同的编译器上检查过它,包括带有 O3 编译标志的 icpc、icl (v19.1.2) 和 g++ (v9.2)。
这是乱序(动态)执行的一个例子吗?