• 20145336张子扬 《网络对抗技术》 PC平台逆向破解


    #20145336张子扬 《网络对抗技术》 PC平台逆向破解
    ##Shellcode注入
    **基础知识**

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

    **实践过程**



    1. 设置环境为:堆栈可执行、地址随机化关闭。指令如下。
    2. 用`execstack -s pwn20145336`命令来将堆栈设为可执行状态
    3. 用`execstack -q pwn20145336`命令来查看文件的堆栈是否是可执行状态
    4. 用`more /proc/sys/kernel/randomize_va_space`命令来查看地址随机化的状态
    5. 用`echo "0" > /proc/sys/kernel/randomize_va_space`命令来关闭地址随机化
    6. 以anything+retaddr+nops+shellcode的结构来构造,先估计返回地址所在位置,并且找到 shellcode 所在地址。
    7. 运行pwn20145336可执行文件。
    8. 打开另一个终端,用`ps -ef | grep pwn20145336`查看pwn20145336的进程号,随后在该终端下进入gdb调试模式。
    9. 由上图知,pwn20145336的进程号为14831
    10. gdb调试:打开gdb,用attach指令对该进程进行调试,对foo函数进行反汇编并在ret处设置断点。
    11. 继续运行到断点处,显示当前esp的值并依照此位置显示接下来的内存地址内容,来分析我们之前猜测的返回地址位置是否正确以及shellcode的地址。(推算出 shellcode 地址为`x31xd3xffxff`)
    12. 将返回地址修改为`0xffffd331`,执行pwn20145336,成功注入 shellcode。

    ##Return-to-libc攻击深入
    **实践过程**

    1. 先配置环境。输入如下指令,创建32位C语言可编译的环境。

            sudo apt-get update
            sudo apt-get install lib32z1 libc6-dev-i386

    2. 输入命令“linux32”进入 32 位 linux 环境。输入“/bin/bash”使用 bash。
    3. 用以下指令关闭地址随机化

            sudo sysctl -w kernel.randomize_va_space=0




    4. 为了不让/bin/bash的防护程序起作用(为了防止shell攻击,程序被调用时会自动弃权),我们使用zsh来代替:

            sudo su
            cd /bin
            rm sh
            ln -s zsh sh
            exit
    5. 在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;
            }



    6. GCC 编译器有一种栈保护机制来阻止缓冲区溢出,所以我们在编译代码时需要用 “–fno-stack-protector” 关闭这种机制。


             sudo su
             gcc -m32 -g -z noexecstack -fno-stack-protector -o retlib retlib.c
             chmod u+s retlib
             exit

    7. .在tmp文件夹下准备“getenvaddr.c”文件用于读取环境变量,并编译。
    8. gcc -m32 -o getenvaddr getenvaddr.c。
    9. 在tmp文件夹下准备“exploit.c”文件用于攻击。
    10. 获取地址

    获取BIN_SH地址 

            export BIN_SH=“/bin/sh”
            echo $BIN_SH
            ./getenvaddr BIN_SH ./retlib

    进入gdb设置断点,调试运行获取system和exit的地址。

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

  • 相关阅读:
    VMware16Pro永久激活key密钥亲测可用
    软件客户端激活码设计思路
    Android 监听外部U盘插入事件
    分享一款由python开发的全能多线程抢购神器,支持华为、京东、淘宝等商城
    android遇见Uninitialized object exists on backward branch 142解决办法
    android framework-下载Android系统源代码
    android-windowManager使用实例
    理解Android Framework
    4种常用线程池介绍
    谈一款MOBA类游戏《码神联盟》的服务端架构设计与实现 (转载)
  • 原文地址:https://www.cnblogs.com/20145336yang/p/6640866.html
Copyright © 2020-2023  润新知