2

这可能吗?

我想将 intel 汇编代码放入 char 缓冲区,然后从 C 程序中执行该代码

如果我将汇编代码放入缓冲区,我可以将其转换为函数指针并调用它吗?

我正在使用 GCC 和 linux

4

6 回答 6

8

您要执行英特尔汇编代码还是机器代码?如果要执行机器代码,那么可以,只要字符缓冲区所在的内存页没有标记为 NX(不执行)。

如果您在谈论汇编代码,那么不,您首先需要通过汇编程序运行代码(在 Un*x 系统上,通常称为标准代码as;在 Linux 上,这应该与 相同gas),然后运行产生的机器码。

于 2009-10-20T03:09:54.493 回答
1

是的,你可以。事实上,这就是缓冲区溢出攻击的工作方式。更多信息谷歌缓冲区溢出攻击。将执行分解为直接汇编总是有效的(只要汇编是正确的)。

于 2009-10-20T03:02:28.003 回答
0

只要您正确使用函数指针语法,这实际上就可以按您期望的方式工作。除了安全漏洞之外,您还可以使用此技术进行性能优化。

我应该知道最好不要用手机输入代码,但是...

unsigned char buffer[]={blah, blah, blah ...};
void (*p)() = (void (*))buffer;
p();
于 2009-10-20T03:53:00.500 回答
0

如果您想在评论中执行类似“pop %[register] push %[register]”的操作,是的,这是可能的,但这并不容易。

您需要编写一个汇编程序或在您的应用程序中嵌入一个开源汇编程序。您将 char 数组提供给汇编器,在另一个缓冲区中创建机器代码(最好是 PIC 代码,这样您就可以省略链接和重定位),并通过函数指针在该缓冲区中执行代码。

如果您可以保证在您运行代码的平台上存在“as”或“gas”,那么您可能会通过一个快速而肮脏的 hack 来调用“as”,并通过管道输入您的代码并输出目标代码。

于 2009-10-20T14:46:18.763 回答
0

也许谷歌可以帮你写一个缓冲区溢出漏洞

于 2009-10-20T03:02:49.933 回答
0

也许——语法是:

char buff[/* enough space */];
/* fill in buff with the right opcodes that conform to the Linux ABI */
((void (*)()) buff) ();

问题是现代 x64 有一种称为“W^X”或“NX 位”的模式,它会阻止上述代码从数据指针执行。有处理这个的 API,但我不熟悉 Linux 的;谷歌搜索似乎表明您实际上在链接时标记了您的 .o 文件,希望禁用 NX 位。这对我来说似乎是个坏主意(相反,您似乎应该能够在运行时将数据区域提升为可执行,或者从内存的可运行区域分配可写区域;但是,嘿,这只是我的意见——也许真的很难做到这一点。)

假设您没有 NX 位或 W^X 问题,那么只需在上面进行投射并有一个球。

于 2009-10-20T03:35:11.197 回答