如何执行汇编操作码而不将其存储到缓冲区 c/python 中?

Posted

技术标签:

【中文标题】如何执行汇编操作码而不将其存储到缓冲区 c/python 中?【英文标题】:How to execute assembly opcodes without storing it into buffer c/python? 【发布时间】:2022-01-17 10:40:59 【问题描述】:

说,我有以下数量的 OpCode 字节\x90\x90\x90\xb8\x05\x00\x00\x00(注意字节长度可能不同)。我想执行这些操作码而不必将其存储到缓冲区中,我不喜欢它的原因是因为缓冲区存储在内存的数据段中,然后您必须为缓冲区提供执行权限可能会引起安全问题。

既然,我们可以使用 c 的内联汇编来执行汇编指令,我期待下面可能会起作用:

__asm__("db 0x90");

但它会抛出Error: no such instruction: db 0x90

谁能告诉我如何执行操作码而不将其存储到缓冲区中,我不介意使用 cpython,因为我正在使用 cython。

【问题讨论】:

如果在 Windows 上工作,您可以获得 PE 的“.text”部分的地址并将这些操作码附加到该部分的末尾。但是您应该确保在该部分的末尾有足够的空间。请注意,您还应该将相对 VA 转换为 VA。 不能在内联汇编中使用伪代码db 您是否尝试将缓冲区变量放入.text 部分? -- 你使用的是哪个目标系统的编译器?您可能需要使用正确的伪指令名称,一些汇编程序需要 .db,对于 x86 上的 GCC,它是 .byte @thebusybee 你真帅 :) 确实是.byte 这工作__asm__(".byte 0xb8;.byte 0x0d; .byte 0x00; .byte 0x00; .byte 0x00; mov %%eax, res":::);printf("%d\n", res); 请拨打tour 了解本网站的运作方式。如果您认为我的回答适合您的问题,请标记它。这就是说“谢谢”的方式。 【参考方案1】:

您的汇编程序的语法要求使用.byte 而不是db

GCC 接受两种不同的方言,“att”和“intel”。默认为“att”,但您可以使用选项-masm=... 更改它。

默认汇编器的文档可以通过关键字“gnu binutils”找到,例如当前版本知道这些pseudo operations。它还列出了字节的助记符.dc.b

【讨论】:

以上是关于如何执行汇编操作码而不将其存储到缓冲区 c/python 中?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用自定义 gradle 插件而不将其发布到 maven/ivy 存储库?

捕获图像而不将其存储到内部/外部存储

执行命令而不将其保留在历史记录中[关闭]

直接将文件上传到SFTP而不将其存储到本地系统[重复]

如何直接保存到持久存储,而不将数据保存到内存中

如何流式传输从 FTP 获取的文件而不将其存储在本地?