如何执行汇编操作码而不将其存储到缓冲区 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
谁能告诉我如何执行操作码而不将其存储到缓冲区中,我不介意使用 c
或 python
,因为我正在使用 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 中?的主要内容,如果未能解决你的问题,请参考以下文章