【问题标题】:Shellcoder's Handbook: first shellcode exampleShellcoder 手册:第一个 shellcode 示例
【发布时间】:2017-09-03 04:52:21
【问题描述】:

我有点困惑第一个 shellcode 示例是如何工作的。我已经通过 GDB 运行它并且我已经验证它是正确的,但我不确定它最终是如何工作的。下面是代码的样子:

char shellcode[] =
"\xeb\x13\x59\x31\xc0\xb0\x04\x31\xdb\x43\x31\xd2\xb2\x0f\xcd\x80"
"\xb0\x01\x4b\xcd\x80\xe8\xe8\xff\xff\xff\x48\x65\x6c\x6c\x6f"
"\x20\x77\x6f\x72\x6c\x64\x0a\x0d";

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

    return 0;
}

(实际上,我已经将最初生成 shell 的 shellcode 替换为打印“Hello world”的 shellcode,但这应该没什么区别。)

ret 只有一个整数指针,它应该只有 4 个字节长,它怎么能工作? shellcode 本身大约有 40 个字节长!如果有的话,所有 ret 应该检索的是 shellcode 的前 4 个字节,而不是执行整个事情!

有人可以向我解释一下这是如何工作的吗?

【问题讨论】:

    标签: c stack shellcode


    【解决方案1】:

    它依赖于编译器(并且依赖于芯片),但我认为正在发生的事情是依赖于这样一个事实,即在堆栈上的位置 2 int 从您的自动变量开始的位置向上是您应该返回的地址从流程返回时跳回。它将该地址替换为 shellcode[] 数组的地址,因此当 main() 返回时,它将执行那里的指令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-03
      • 2019-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-16
      相关资源
      最近更新 更多