我对第一个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/