2012-05-10 205 views
2

我已经给了一个C代码文件,其中给出正确的输入发生缓冲区溢出,然后授予root访问权限。这是一个使用ZShell的Fedora bug。为了测试这个(安全主题),我们禁用了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; 
} 
+0

要开始,我会建议尝试溢出'valgrind'中的输入并查看堆栈值等。但是,您是否编写了程序集并自己获取了字节码?这样做可能更有意义。另外,确保你有一个可执行的堆栈。改变输入点最有可能确定堆栈发生了什么。 – RageD

+0

你知道*什么时候会出现分段错误?你知道如何在不改变输入的情况下导致它,或者提供不同的输入吗?实验。 –

+2

你可能有一些笔记与作业一起去。他们可能在某个时候讨论堆栈布局,重新阅读它们。当调用'vuln'函数时,堆栈中有一些空间用于(除其他外)数组'a'和返回地址。当您尝试将更多数据写入'a'时,会发生什么情况比适合?输入一些容易识别的数据作为输入。获取段错误并保存核心转储。在GDB中打开核心转储。现在看看寄存器。通过改变输入的长度来查看是否可以获得特定的值以显示在EIP中。 –

回答

1

我不明白的是,我为什么要使用不同的值测试?我不确定代码会有帮助,但我不知道改变输入的重点。

缓冲区溢出只会发生在给定的输入,所以你应该尝试不同的输入,看看会导致问题发生。

提示:当用户输入的时间比预期的程序长时,会发生缓冲区溢出,所以您应该尝试使用不同的输入长度,直到程序开始崩溃或做出意想不到的事情。