代码之家  ›  专栏  ›  技术社区  ›  Bob5421

在c可执行文件中运行数据外壳代码

  •  1
  • Bob5421  · 技术社区  · 7 年前

    #include <stdio.h>
    
    char buffer[]={0x90,0x90,0xC3};
    
    int main(int argc, char *argv[])
    {
        void (*fct)();
        fct=buffer;
        fct();
        return 0;
    }
    

    0x90操作码为NOP

    我想知道我应该怎么做才能运行这个程序。我运行它时出错。。。

    谢谢

    1 回复  |  直到 7 年前
        1
  •  3
  •   Peter Cordes    6 年前

    太长,读不下去了 -z execstack 为可执行文件启用Linux的read暗示exec特性。尽管有这个名字,它也适用于 页面,而不仅仅是堆栈。


    程序出错是因为 buffer 符号进入 .data 与其他部分一起依次进入映射为读写的ELF段的部分 不可执行 .

    使 缓冲器 在这个新的部分。
    原则上 使用以下链接器脚本:

    PHDRS
    {
            MYSEG PT_LOAD FLAGS (7);
    }
    SECTIONS
    {
            MYSECT : { *(MYSECT) } : MYSEG
    }
    

    ,更改源:

    #include <stdio.h>
    
    char buffer[] __attribute__ ((section ("MYSECT"))) ={0x90,0x90,0xC3};
    
    int main(int argc, char *argv[])
    {
        void (*fct)();
        fct=buffer;
        fct();
        return 0;
    }
    

    -T

    但是这个 不会
    GCC使用基于命令行和 -T型
    可以使用 -Wl,-verbose 并更新它。

    如果我们首先用 -c 然后,我们只能得到一个片段,因为这就是我们在链接器脚本中所做的-从而挫败了我们所做的所有努力 只有 缓冲器 唯一的可执行数据。


    -z执行堆栈 实际上,我们只告诉GCC使用设置 GNU_STACK ELF段RWE。
    这是加载器用来为堆栈页设置正确权限的标记段(大小和lma为零)。
    But in truth it is used as a compatibility switch -当堆栈设置为可执行时,加载程序将设置 全部的

    如果你在玩外壳代码 -z执行堆栈

    推荐文章