• 20145223 杨梦云 《网络对抗》shellcode实验+return-to-libc实验


    20145223 杨梦云 《网络对抗》shellcode实验+return-to-libc实验

    shellcode注入实践

    Shellcode基础知识

    ·Shellcode实际是一段代码(也可以是填充数据),是用来发送到服务器利用特定漏洞的代码,一般可以获取权限

    ·Shellcode一般是作为数据发送给受攻击服务器的。 Shellcode是溢出程序和蠕虫病毒的核心,一般会和系统里的漏洞相关,因此shellcode只对没有打补丁的主机有用武之地。

    ·漏洞利用中最关键的是Shellcode的编写。由于漏洞发现者在漏洞发现之初并不会给出完整Shellcode,因此掌握Shellcode编写技术就显得尤为重要。

    实践过程:

    (一)实践中的shellcode代码如下:

    (二)设置环境
    为了防止注入,程序在编译时,编译器在每次函数调用前后都会加入一定的代码,用来设置和检测堆栈上设置的特定数字,以确认是否有bof攻击发生。同时GCC中的编译器有堆栈保护技术也会适使得注入到堆栈上的shellcode无法执行而达到保护的目的。因此要想实验成功进行,须对环境进行手工设置。(x32环境)

    apt-cache search execstack
    apt-get install execstack
    

    execstack --help
    

    /proc/sys/kernel/randomize_va_space=0  //关闭地址随机化 
    execstack -s pwn1    //设置堆栈可执行
    execstack -q pwn1    //查询文件的堆栈是否可执行
    

    (三)输入perl -e 'print "x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x4x3x2x1x00"' > input_shellcode构造攻击buf(最后一个字符不能是x0a,因为相当于回车,这样接下来的实验就做不了)

    (四)重新打开一个新的终端窗口注入这段攻击buf(但是输入指令回车后先不要回车,之前因为手贱不小心点了回车以至于做了好几次才成功= =。)

    (cat input_shellcode;cat) | ./5223pwn1
    

    (五)再打开第一个终端,查找进程5223pwn1的id号:

    可以看见进程ID是3937,打开gdb进行调试,foo反汇编:

    (六)在ret函数这里设置断点,查看注入buf的内存地址,分析之前猜测的返回地址位置是否正确以及shellcode的地址

    最后可以看到应该将地址修改为0xffffd310

    (七)将返回地址修改为重新注入,失败了,重复之前的步骤,查看进程id,进行gdb调试:

    (八)重新注入,成功:

    Retuen-to-libc实践

    基础知识:

    ·缓冲区溢出攻击的原理使得我们在实施时通常首先要将恶意代码注入目标漏洞程序中,通常攻击者需要将此攻击代码置于堆栈中。于是为了阻止此种类型的攻击,缓冲区溢出防御机制采用了非执行堆栈技术,这种技术使得堆栈上的恶意代码不可执行。

    ·为了避开非执行堆栈技术,出现了 return-into-libc 攻击,这种攻击是缓冲区溢出的变体,它的实施不需要栈就可以执行,甚至不需要注入新的代码,取而代之的是重用漏洞程序中已有的函数完成攻击,让漏洞程序跳转到已有的代码序列。实施攻击时攻击者仍然可以用恶意代码的地址来覆盖程序函数调用的返回地址,并传递重新设定好的参数使其能够按攻击者的期望运行。

    实践过程:

    (一)首先在kali虚拟机上添加一个新的用户:

    (二)环境需要32位,因此需要事先进行安装,安装好后进入32位环境,进入bash,关闭地址随机化,并且把/bin/sh指向zsh:

    (三)漏洞程序代码如下,并且将c文件保存在/tmp目录下:

    (四)编译代码,fno-stack-protector关闭阻止缓冲区溢出的栈保护机制,并设置给该程序的所有者以suid权限,可以像root用户一样操作:

    (五)getenvaddr.c代码如下,该程序用于读取环境变量:

    (六)exploit程序代码如下,通过修改该程序里的地址,结合5223retlib程序产生漏洞来实现攻击:

    (七)获取 BIN_SH 地址为0xffffdf2a

    (八)在root下编译运行程序:

    (九)gdb调试exploit程序获取systemexit地址,分别为0xf7e338500xf7e276c0

    (十)将上述获取到的三个地址对exploit程序进行修改:

    (十一)成功:

  • 相关阅读:
    对offsetHeight,clientHeight,scrollHeight的理解
    对word-wrap和word-break的理解
    数据结构之线性表(严蔚敏《数据结构》要求)
    1-数据结构之线性表
    结构体变量声明及初始化的的那些坑
    指针与函数
    数组的深入理解
    0-绪论
    别让无知成恶趣!
    电路分析-3
  • 原文地址:https://www.cnblogs.com/20145223ymy/p/6649253.html
Copyright © 2020-2023  润新知