【问题标题】:Call assembly in buffer in C在 C 中的缓冲区中调用程序集
【发布时间】:2009-10-20 02:59:38
【问题描述】:

这可能吗?

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

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

我正在使用 GCC 和 linux

【问题讨论】:

  • 我想我要做的是将英特尔代码而不是机器代码放入缓冲区,所以我想这不会起作用。为了确保,我将诸如 pop %[register] push %[register] movl、addl 之类的东西放入 char 缓冲区并将其转换为函数指针?如果我确实设法在其中获取机器代码,我认为 mprotect() 会帮助我执行此操作
  • @Jamie,请用几句话解释你的意图。您是否打算创建缓冲区溢出漏洞?
  • 英特尔汇编语言只是文本 - 不是可执行代码。您需要先组装它,然后才能运行它(您可以让编译器提供帮助 - 例如,请参阅 Visual Studio 中的 __asm { } 构造)。

标签: c assembly buffer call


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 好吧,对不起。我应该更精确。在我看来,汇编和机器代码非常接近。
    【解决方案3】:

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

    【讨论】:

    【解决方案4】:

    也许——语法是:

    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 问题,那么只需执行上面的投射并有一个球。

    【讨论】:

    • 在 Linux 中,您可以使用 mprotect 将内存区域提升为可执行。
    • 这不是 x64 特定的 - 自 WinXP SP2 以来就一直存在。您可以关闭进程的 DEP(或天堂禁止 - 系统),也可以在调用之前关闭 VirtualProtect(buff, sizeof(buff), PAGE_EXECUTE_READWRITE)。
    【解决方案5】:

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

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

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

    【讨论】:

      【解决方案6】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2018-03-05
        • 1970-01-01
        • 1970-01-01
        • 2012-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多