如何让这个缓冲区溢出?

信息安全 开发 缓冲区溢出 C
2021-08-17 20:55:38

我正在尝试理解缓冲区溢出,并且正在使用一段简单的代码,如下所示。

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

int bof(char *str)
{
    char buffer[12];
    strcpy(buffer,str);
    return 1;
}

int main(int argc, char **argv)
{
    char str[517];
    FILE *badfile;

    badfile = fopen("badfile", "r");
    fread(str, sizeof(char), 517, badfile);
    bof(str);
    printf("Returned Properly\n");
    return 1;
}

我知道我需要在“badfile”中注入 shell 代码,假设我创建了一个这样的 badfile:

char buffer[517];
FILE *badfile;
memset(&buffer, 0x90, 517);
badfile = fopen("./badfile", "w");
fwrite(buffer, 517, 1, badfile);

我是否在缓冲区 [] 的第 12 个索引处注入它?我面临一个问题。但我相信那是因为它不是回归位置。我必须计算返回位置吗?谢谢。

3个回答

不,不完全是。

有两点需要关注:

  • 覆盖返回地址。您需要弄清楚文件中的哪些字节最终会覆盖返回地址。假设这些是文件的 20-23 字节(例如)。

  • shellcode 的位置。您应该稍后将您的 shell 代码放入文件中(例如,接近末尾)。然后你需要预测你的 shell 代码将在哪个地址加载到内存中。假设A是将 shellcode 加载到内存的地址。你需要知道这个地址,因为这是你需要用来覆盖返回地址的。

一旦你知道了这两个,你就可以开始了。您将值A存储到文件的 20-23 字节中,稍后将 shell 代码存储在您决定放置它的文件中。

要解决这两件事,您需要查看堆栈布局。

  • 首先,找到str堆栈中出现的起始位置与出现返回地址的位置之间的偏移量。这个偏移量告诉你文件中的哪些字节最终会覆盖返回地址。如果这个偏移量是 20 字节,那么文件的 20-23 字节最终将被写入返回地址。为了使攻击起作用,您需要在文件中的 20 个字节中放入一个值,该值是您希望程序跳转到的位置(shell 代码的开始地址)。该值将覆盖返回地址。放在那里的值是上面提到的地址A。

  • 其次,将shell代码放在文件的后面,预测一旦文件被读入内存,shell代码将存储在内存中的哪个地址,并使用该起始地址作为覆盖返回地址的值。

我建议您阅读Aleph One的 Smashing The Stack For Fun And Profit它有一个关于学习如何进行堆栈粉碎缓冲区溢出漏洞利用的优秀教程。(提示:在现代系统上,请确保首先手动禁用 ASLR 和 DEP,这样您的漏洞才会起作用。)

这绝对是香草缓冲区溢出。但是您还需要找到返回指针在堆栈中存储位置的确切偏移量。(提示:肯定不是 12 字节,考虑存储的保存的 EBP)。您是对的,您还需要计算注入到 badfile 中的 shell 代码的返回地址。不过让我警告你,因为这里的缓冲区只有 12 个字节,我相信很难在那个空间中注入一个 12 字节的 shell 代码。环顾四周,看看能不能找到一个。但是您可以将 shell 代码放入堆栈的后面部分,因为 main 中的 buf 是 517 字节长。这意味着文件的前 12 个字节可能是垃圾文件。

提示http ://www.securitytube.net/groups?operation=view&groupId=4

将上述关于缓冲区溢出的视频教程视为缓冲区溢出的圣经

使用 GDB,跟踪你的代码,关注堆栈指针,堆栈本身。

你的缓冲区太小,无法容纳 shell 代码 + 返回地址。如果您打算测试这个概念,请将其放大一点。此外,您可以将 shellcode 放入 ENV。