2009-10-20 16 views
2

这可能吗?在缓冲区中调用程序集C

我想要放置Intel汇编代码转换成一个字符缓冲区,然后从C程序

内执行的代码如果我放置在组件代码到一个缓冲器,能予浇铸成一个函数指针和呼叫那?

我使用GCC和Linux

+0

我想我要做的是把英特尔代码,而不是机器代码,放入缓冲区,所以我想这不会工作。 只是为了确保,我把东西像 弹出%[注册] 推%[注册] MOVL,ADDL 成字符缓冲区和铸造的一个函数指针? 我认为mprotect()将帮助我执行此操作,如果我确实设法获取机器代码 – Jamie 2009-10-20 04:17:37

+0

@Jamie,请用几句话解释您的意图。您是否打算创建缓冲区溢出漏洞? – Adriaan 2009-10-20 13:53:01

+0

英特尔汇编语言只是文本 - 不是可执行代码。在运行它之前,您需要先将它组装起来(您可以让编译器提供帮助 - 例如,请参阅Visual Studio中的__asm {}构造)。 – SecurityMatt 2012-03-11 22:41:42

回答

1

是的,你可以。事实上,这是缓冲区溢出攻击如何工作。欲了解更多信息谷歌缓冲区溢出攻击将执行分解为直接装配将始终有效(只要装配正确)。

+0

嗯,不是汇编代码。机器代码。 – Tordek 2009-10-20 03:10:23

+0

恩,对不起。我应该更精确。在我看来,组装和机器代码非常接近。 – 2009-10-20 04:01:25

0

也许谷歌可以帮你write a buffer overflow exploit

+0

对不起,官方的一致意见(http://meta.stackexchange.com/questions/8724/how-to-deal-with-google-questions)是用简单的Google链接回答不被接受。 – 2009-10-20 03:06:55

+0

我想埃米尔想指出坏意图的可能性。 – Adriaan 2009-10-20 13:49:18

8

是否要执行英特尔程序集代码或机器代码?如果你想执行机器代码,那么是的,你可以,只要字符缓冲区所在的内存页面没有标记为NX(不执行)。

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

+0

+1,这也是我对原始问题的解读。 – 2009-10-20 03:13:26

0

也许 - 语法是:

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

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

假设你没有NX位或W^X问题,那么只要做到这一点上面,并有一个球。

+1

在Linux中,您可以使用mprotect将内存区域提升为可执行文件。 – 2009-10-20 06:15:06

+0

这不是x64特有的 - 从WinXP SP2开始就一直存在。您可以关闭进程的DEP(或禁止天堂 - 系统),也可以在进行呼叫之前使用VirtualProtect(buff,sizeof(buff),PAGE_EXECUTE_READWRITE)。 – SecurityMatt 2012-03-11 22:58:47

0

只要你获得了函数指针语法的权利,这实际上就是你期望的方式。除了安全漏洞之外,您可以使用此技术进行性能优化。

我应该知道优于输入的代码与我的手机,但是......

unsigned char buffer[]={blah, blah, blah ...}; 
void (*p)() = (void (*))buffer; 
p(); 
0

如果要像“流行%[注册]推%[注册]”为你写的东西执行在你的评论中,是的,这是可能的,但这并不容易。

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

如果您可以保证在平台上有“as”或“gas”运行代码,那么您可能会通过快速肮脏的hack与代码管道调用“as”并且目标代码管道。