Shellcoder's Handbook:第一个shellcode示例

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()返回时,它将执行那里的指令。