Shellcoder 手册:第一个 shellcode 示例

Shellcoder's Handbook: first shellcode example

我对第一个 shell 代码示例的工作原理有点困惑。我已经通过 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 的 shell 代码替换为打印 "Hello world" 的代码,但这不会有太大区别。)

如果它只是一个整型指针,应​​该只有 4 个字节长,ret 如何工作? shell代码本身大约有 40 个字节长!如果有的话,所有 ret 应该检索的是 shell 代码的前 4 个字节,而不是执行整个事情!

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

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