0
char shellcode[] =        "\xeb\x2a\x5e\x89\x76\x08\xc6\x46\x07\x00\xc7\x46\x0c\x00\x00\x00"        "\x00\xb8\x0b\x00\x00\x00\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80"        "\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80\xe8\xd1\xff\xff"        "\xff\x2f\x62\x69\x6e\x2f\x73\x68\x00\x89\xec\x5d\xc3";

void main() {
   int *ret;  
   ret = (int *)&ret + 2;  
   (*ret) = (int)shellcode;
}

据我所知,shellcode[]是用于生成 shell 的十六进制操作码,代码的最后一行用操作码覆盖 ret。我们是否将操作码或内存地址插入 RET ?

4

3 回答 3

2

它不会覆盖返回操作码,它会覆盖堆栈上的返回地址(假设它靠近堆栈上声明的变量),以便在main()返回时它不会返回,_start+n而是返回到shellcode.

于 2011-04-21T19:26:04.100 回答
0

堆栈上的 ret 寄存器是代码返回的位置,将操作码放在那里不会有太大帮助。我怀疑您要运行的代码地址是最有可能的候选者。耶!总体而言,最好考虑您正在与之交互的项目的用途以及它们的使用方式,而不是试图盲目地将数据转储到其中。

于 2011-04-21T18:07:56.610 回答
0

就目前而言,它将地址插入到字符串中。我想在这种情况下,指出它完全不可移植并且几乎可以肯定是一个非常糟糕的主意有点浪费时间......

于 2011-04-21T19:20:03.757 回答