我对第一个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到显示“ Hello world”的shell代码的shellcode,但这没什么大不了。)

如果ret仅是一个整数指针(应该只有4个字节长),该如何工作? shellcode本身大约有40个字节长!如果有的话,所有ret应该退回的都是shellcode的前4个字节,而不是全部执行!

有人可以告诉我这是怎么回事吗?

最佳答案

它是依赖于编译器的(并且依赖于芯片),但是我认为正在发生的事情是,它依赖于以下事实:在堆栈2的位置上,从自动变量开始的int处是返回地址,您应该跳回到从过程返回时。它用shellcode []数组的地址替换了该地址,所以当main()返回时,它将在那里执行指令。

关于c - Shellcoder的手册:第一个Shellcode示例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46020382/

10-12 16:09