Shellcoder's Handbook:第一个shellcode示例
问题描述:
我有点困惑第一个shellcode示例如何工作。我已经通过GDB运行了它,并且我已经验证它是正确的,但我不确定它如何最终在第一个地方工作。下面是代码的样子:(其实我已经取代了最初产生一个外壳的shellcode到一个输出“Hello World”,但不应该有太大的差异)Shellcoder's Handbook:第一个shellcode示例
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;
}
ret
如果只有一个整数指针,它应该只有4个字节长,它该如何工作? shellcode本身大约有40个字节长!如果有的话,所有ret
应该retreive是shellcode的前4个字节,而不是执行整个事情!
有人可以请向我解释这是如何工作的?
答
它依赖于编译器(和芯片有关),但是我认为发生的事情是它依赖于这样一个事实,即在堆栈2的位置int从自动变量的起始位置开始是返回地址应该从流程返回时跳回。它用shellcode []数组的地址替换该地址,所以当main()返回时,它将执行那里的指令。