精华内容
下载资源
问答
  • Linux_x86栈溢出攻击实验——写在前面的话
    2019-09-23 17:12:29

    师父说,要想在安全这个行业走得远,首先要看兴趣。其实我有些怀疑自己的兴趣,不过干一行爱一行。

    最近由于某种原因开始接触二进制漏洞,特别小白那种,虽然漏洞原理两三句话说得清清楚楚,但要实际操作起来真的不知如何下手。因此将自己的从0到1的经历写出来分享跟我一样的小白,尽可能做到超级详细通俗易懂,一方面记录自己的学习过程以及踩过的坑,另一方面希望能坚持更新博客也给自己坚持学习的动力,希望在这个过程中培养自己对安全的一点点兴趣吧。
    首先需要明确大方向,是研究linux系统下的二进制漏洞,还是windows系统下。如果对linux系统有简单的了解,会使用基本的命名,建议直接选择在linux平台下做实验。否则可以跟着westfail教程先在windows下实践,跟着教程一步一步实现基本的栈溢出漏洞,先感受一下当理论被成功实践的激动。
    https://bbs.pediy.com/thread-56445.htm

    接下来就开始我们linux环境下的准备工作啦~~
    敲重点!!两个踩过的大坑
    1、务必使用64位机器,pwntools不支持32位python
    2、32位机器只能编译生成32位程序,64位机器可以生成32位和64位程序,因此不要担心在64位系统中如何分析32位程序

    需要用到的工具:
    1、 gcc编译器
    2、 gdb 动态调试器、peda插件
    3、 objdump 查看二进制文件信息的工具
    4、 pwntools 编写exp利器
    5、 ROPgadget在二进制文件中搜索gadget
    6、 x64系统中安装32位程序运行和编译环境,编译时添加-m32选项生成32位程序

    需要具备的基础知识:
    1、 基础汇编知识,如ESP、EBP、EIP等寄存器,mov、add、call、ret等指令
    2、 运行时C语言在内存中的分配,重点为栈(存储函数的参数、局部变量等)
    3、 函数调用与返回过程
    4、 二进制程序保护机制,NX/DEP、SP、ASLR、PIE等
    5、 动态链接中GOT表、PLT表与延迟绑定技术
    6、 X64环境下考虑与32位的不同,寄存器以及函数调用
    在时间允许的情况下,该部分知识我也会单独整理的~

    实验思路:(未开启PIE,程序装载位置确定)
    1、 ret2shellcode:关闭全部保护机制,通过往栈中注入代码实现栈溢出攻击
    2、 ret2libc:开启NX/DEP机制,使得注入的代码不能执行,寻找libc中函数执行
    3、 ROP:开启ASLR,libc库装载位置随机,考虑泄露libc中某个函数如wirte(),根据相对地址来计算
    4、 在不获取目标机器libc.so的情况下使用内存泄露进行ROP攻击
    (234是在越来越强的保护机制下寻找system()函数和字符串/bin/sh地址,构造system()函数栈,从而在不注入代码的情况下执行system(“/bin/sh”)函数打开shell)
    实验以蒸米的例子做演示,加入更详细的步骤以及解释。
    https://www.cnblogs.com/alisecurity/p/5646656.html

    栈溢出攻击实施基本思路:
    1、 找到函数返回地址,即输入栈中的数据要覆盖到哪里
    2、 用什么值覆盖返回地址,即控制程序流,使其运行新的返回地址处的指令
    3、 编写shellcode(先使用汇编语言编写,再编译反汇编得到机器码),将shellcode注入栈中,使返回地址指向shellcode(此步骤在代码注入攻击中需要,代码复用攻击直接利用内存中存在的代码)
    4、 编写exp

    最后想说一句,工欲善其事,必先利其器!所以在开始实验之前最好一次性将要用到的工具安装好~以免实验做到一半要安装软件时发现大坑,比如我在32位系统上安全pwntools折腾了好久哈哈哈哈

    更多相关内容
  • 对于实验的原理我并不太清楚,应该是吧foo函数的返回地址篡改到malice函数的入口,最后不断循环malice函数用栈帧把占满导致溢出呢? 附上程序原文: void malice() { printf("you have been attacked.\n"); } ...
  • 基本的栈溢出攻击,是最早产生的一种缓冲区溢出攻击方法,它是所有其他缓冲区溢出攻击的基础。但是,由于这种攻击方法产生的时间比较长,故而GCC编译器、Linux操作系统提供了一些机制来阻止这种攻击方法对系统产生...
  • 栈溢出逆向实验

    2021-10-24 10:19:29
    栈溢出逆向实验 一、实验背景 1.内存的不同用途 缓冲区溢出是在大缓冲区中的数据向小缓冲区复制的过程中,由于没有注意小缓冲区的边界,“撑爆”了较小的缓冲区,从而冲掉了和小缓冲区相邻内存区域的其他数据而引起...

    栈溢出逆向实验

    一、实验背景

    1.内存的不同用途

    缓冲区溢出是在大缓冲区中的数据向小缓冲区复制的过程中,由于没有注意小缓冲区的边界,“撑爆”了较小的缓冲区,从而冲掉了和小缓冲区相邻内存区域的其他数据而引起的内存问题。缓冲溢出是最常见的内存错误之一,也是攻击者入侵系统时所用到的最强大、最经典的一类漏洞利用方式。成功地利用缓冲区溢出漏洞可以修改内存中变量的值,甚至可以劫持进程,执行恶意代码,最终获得主机的控制权。要透彻地理解这种攻击方式,我们需要回顾一些计算机体系架构方面的基础知识,搞清楚 CPU、寄存器、内存是怎样协同工作而让程序流畅执行的。

    根据不同的操作系统,一个进程可能被分配到不同的内存区域去执行。但是不管什么样的操作系统、什么样的计算机架构,进程使用的内存都可以按照功能大致分成以下 4 个部分。

    (1)代码区:这个区域存储着被装入执行的二进制机器代码,处理器会到这个区域取指并执行。
    (2)数据区:用于存储全局变量等。
    (3)堆区:进程可以在堆区动态地请求一定大小的内存,并在用完之后归还给堆区。动态分配和回收是堆区的特点。
    (4)栈区:用于动态地存储函数之间的调用关系,以保证被调用函数在返回时恢复到母函数中继续执行。

    2.栈

    从计算机科学的角度来看,栈指的是一种数据结构,是一种先进后出的数据表。栈的最常见操作有两种:压栈(PUSH)、弹栈(POP);用于标识栈的属性也有两个:栈顶(TOP)、栈底(BASE)。可以把栈想象成一操扑克牌。

    ·PUSH:为栈增加一个元素的操作叫做 PUSH,相当于在这螺扑克牌的最上面再放上一张。

    ·POP:从栈中取出一个元素的操作叫做 POP,相当于从这操扑克牌取出最上面的一张。

    ·TOP:标识栈顶位置,并且是动态变化的。每做一次 PUSH 操作,它都会自增 1;相反,每做一次 POP 操作,它会自减 1。栈顶元素相当于扑克牌最上面一张,只有这张牌的花色是当前可以看到的。

    ·BASE:标识栈底位置,它记录着扑克牌最下面一张的位置。BASE 用于防止栈空后继续弹栈(牌发完时就不能再去揭牌了)。很明显,一般情况下,BASE 是不会变动的。内存的栈区实际上指的就是系统栈。系统栈由系统自动维护,它用于实现高级语言中函数的调用。对于类似 C 语言这样的高级语言,系统栈的 PUSH、POP 等堆栈平衡细节是透明的。

    一般说来,只有在使用汇编语言开发程序的时候,才需要和它直接打交道。

    二、实验目的

    探究发生栈溢出的原因以及导致的后果。

    三、实验内容

    1.IDA 静态分析

    首先打开 IDA,将.exe 文件拖入 IDA,找到 main 函数,按快捷键 F5 查看其伪代码,如图。

    在这里插入图片描述
    再查看 verify_password 函数,如下图。
    在这里插入图片描述
    通过以上对伪代码分析可以对该程序有一个初步的认识。

    2.ollydbg 动态分析

    将程序拖到 od 中打开,找到 main 函数。

    根据“常识”,在 GetCommandLineA 后不远处就是 main 入口,在 main 之前会有(三个)连续的压栈操作。

    在这里插入图片描述

    找到 scanf 函数。
    在这里插入图片描述
    进入函数,首先看见的就是常规操作,将前栈基址入栈,抬高栈顶(给局部变量申请空间),之后可以看到在调用 strcmp 函数之前将他的两个参数从右至左入栈,静态值“1234567”是写在程序的数据段中的,另一个是参数 password,在第一个(只有一个)参数即[arg.1]位置。strcmp 执行结果在 eax 寄存器中,然后将结果赋值给变量 authentication,即第一个变量,就是[local.1]位置(图里不小心画到 strcpy 参数入栈里了)。然后进行 strcpy 函数的参数入栈,从右至左是 password 和 buffer,buffer 就是第二个参数(因为长度是 8,所以[local.3]),将他们入栈之后调用 strcpy,将 password 内容拷贝到 buffer 里。然后(进行清理栈空间操作后)返回。

    回到 IDA,点击 verify_password 中的 dest

    在这里插入图片描述
    看一下 Dest 在 ebp-0xC 的地址空间,而用于返回的临时变量是在 ebp-0x4的栈空间,这样如过复制的内存长于 8 个字节,则会溢出一个\x00 字节到临时变量的空间,因为 strcpy 会在复制后补上一个\x00 结束符。strcmp 函数的返回值有 0,1,-1 三种情况。
    1.如果是 1,溢出的\x00 刚好覆盖了最后一个字节,使得临时变量变为 0。
    2.如果是-1,由于是负数,有最高位符号位的存在,是无法变成 0 的。
    这里就会出现栈溢出。栈溢出就是指栈中的(缓冲区)内容被写入了大于原本(申请的)大小的内容,导致多余的内容覆盖了缓冲区后面的其他地址空间内原有的内容。

    在这里插入图片描述
    打开程序测试:
    在这里插入图片描述
    可知需要输入的密码长度等于 8,并且与 1234567 的 strcmp 结果是正数即可通过测试

    展开全文
  • 栈溢出的简单实验

    2020-09-17 21:48:29
    实验用到first和first.c文件,first中的代码如下,可以看到用于攻击的wuwu()函数是永远不会被调用执行的;但是gets()是一直读取输入的字符直到读取\n才停止,由于gets()没有读取长度的限制,可以通过读取超出规定...

    实验用到first和first.c文件,first中的代码如下,可以看到用于攻击的wuwu()函数是永远不会被调用执行的;但是gets()是一直读取输入的字符直到读取\n才停止,由于gets()没有读取长度的限制,可以通过读取超出规定长度的字符来修改栈帧中的返回地址,从而达到攻击目的;在这里插入图片描述
    右键first,使用IDA打开,打开之后可以看到是这样的汇编指令,按Tab键可以看地址,空格可以看反编译代码;

    在这里插入图片描述
    main()函数
    在这里插入图片描述
    wuwu()函数
    在这里插入图片描述
    进入运行vbox虚拟机,打开虚拟机后先挂载共享文件夹,挂载后才能使用共享文件夹中的实验素材,挂载命令:sudo mount -t vboxsf pwn ~/share (pwn是本地挂载的共享文件夹名)挂载成功后使用ls命令查看。
    在这里插入图片描述
    使用cd share命令进入share文件夹下,touch aaa用于创建一个名为“aaa”的文件,去pwn文件夹下看到aaa文件创建成功,可以开始实验;
    在这里插入图片描述
    在这里插入图片描述
    用cd 01-first命令进入/01-first文件夹下,使用ls -al命令列举出当前文件夹下所有文件的信息,可以看到first文件是有write权限的,如果没有,用chmod +x first命令添加;
    在这里插入图片描述
    用./first运行一下,可以正常运行;
    在这里插入图片描述
    调试程序可以看到,如果将返回地址覆盖掉,变成wuwu()的入口地址,则返回时就会跳到wuwu()函数执行;
    在这里插入图片描述
    调试程序时,用b main可以在main()函数设置断点,输入r跑程序,n下一条,跑到gets()函数后输入AAAA,使用stack 20命令可以查看20行栈帧的内容;
    0xffffdc70保存的是AAAA,通用寄存器eax距栈底指针ebp有0x18个字节,加上ebp占用的空间是0x1c,0xffffdc8c指向的是返回地址;计算好了ebp与eax的距离,当执行到ret命令时,将返回地址改变,就会跳转到对应的地址执行对应的命令;
    在这里插入图片描述
    我们要跳转到wuwu()的位置,wuwu()的入口地址可以用IDA查看;
    在这里插入图片描述
    跳转的地址不是正常的ASCII码,没有办法手工输入,所以写一个程序来输入;使用vi a.py打开一个文件;代码如下:
    在这里插入图片描述

    from pwn import *  //引用pwntools类库,进行二进制的利用
    p = process(./first’)  //启动一个进程
    p.sendline('A'*0x18+'BBBB'+p32(0x0804849B)) 
    //发送一行给gets(),填充0x18个字节,加‘BBBB’占ebp的空间,加wuwu()的返回地址
    p.interactive()  //进入交互模式,可以使用拿到的shell
    

    成功运行后进行调试,stack 20查看栈内内容:
    两个白框圈起的地址相距0x18字节,存的是“AAAA……”,ebp指向的“BBBB”,红框圈起的是将会返回的地址,可以看出会返回到wuwu();
    在这里插入图片描述
    EIP指向下一条要执行的指令地址,即为ret,此时wuwu()入口地址位于栈顶,即将执行;
    在这里插入图片描述
    wuwu()执行;
    在这里插入图片描述
    本实验是利用gets()函数没有限制输入长度的特点进行的,局部变量与返回地址都存在栈中,如果局部变量溢出,就可能覆盖掉返回地址。

    展开全文
  • 栈溢出实验

    2020-06-21 16:22:04
    栈溢出实验实验目的完成功能实验环境实验代码实验过程1.函数栈2.构造字符串(1) 查看attack()函数的地址(2) 查看fun()函数的ESP和EBP(3) 标注内存图(3) 构造字符串(3) 成功时的内存分布状况实验结果 ...

    实验目的

    在掌握栈帧结构的基础上,学习栈溢出漏洞的基本原理。

    完成功能

    在函数的栈帧中,局部变量是顺序排列的,栈帧中还保存前栈帧EBP及返回地址RET等信息。构造password.txt。使得str在读取该文件后恰能够覆盖fun函数的返回地址,从而运行attack函数。

    实验环境

    CodeBlocks、UltraEdit

    实验代码

    #include <stdio.h>
    void attack(){
      printf("Attacked!\n");
      exit(0);
    }
    
    void fun(){
       char password[6]="ABCDE";
       char str[6];
       FILE *fp;
       if(!(fp=fopen("password.txt","r"))){
           exit(0);
       }
       fscanf(fp,"%s",str);
    
       str[5]='\0';
       if(strcmp(str,password)==0)
        printf("OK!\n");
       else
        printf("NO!\n");
    }
    
    int main()
    {
        fun();
        return 0;
    }
    
    

    实验过程

    1.函数栈

    EBP:栈底 存储着上一个栈的栈底EBP
    ESP:栈顶 存储着系统栈的栈顶(函数栈形成是保存系统栈栈顶)

    2.构造字符串

    (1) 查看attack()函数的地址

    在这里插入图片描述

    (2) 查看fun()函数的ESP和EBP

    在这里插入图片描述

    (3) 标注内存图

    在这里插入图片描述

    (3) 构造字符串

    如上图所示我们需要构造32个字符来覆盖到返回值,前28个用于覆盖str到EBP,在返回值处我们使用attack()函数的地址转化过来的字符(注意地址的高低位)

    在这里插入图片描述

    (3) 成功时的内存分布状况

    在这里插入图片描述

    实验结果

    在这里插入图片描述在这里插入图片描述

    展开全文
  • 已知目标主机(Microsoft Windows XP SP3)运行着CCProxy 6.2(演示版),且Microsoft Windows XP SP3内存0x7FFA4512处有一条JMP ESP指令,要求以"JMP ESP"为攻击跳板利用该栈溢出漏洞,攻击目标主机,在目标主机上...
  • 栈溢出攻击

    2021-02-12 07:14:44
    我们先来看下面的一个例子: ~~~ #include int main(){ char str[10] = {0};... 栈溢出一般不会产生严重的后果,但是如果有用户精心构造栈溢出,让返回地址指向恶意代码,那就比较危险了,这就是常说的栈溢出攻击
  • 网上找的实验都没怎么理解,最后捣鼓出来了 参考博客:https://blog.csdn.net/fightte/article/details/109010953 原理 数据和地址是连续存储的,跳转地址可以被覆盖,当覆盖的内容为特定地址时就会跳转到特定的...
  • 首先我的实验环境和教程均来自http://staff.ustc.edu.cn/~sycheng/ssat/,我这里讲的是《栈溢出 & 整数溢出》这个课程的实验实验开始,首先你要准备好环境,我的操作系统是kali-linux-2017.1-i386然后你要安装...
  • 目前大部分的缓冲区溢出的攻击都是...作者针对Windows操作系统,对栈溢出的原理进行了相关分析,并通过实例完成了一个溢出的攻击验证.实验结果表明,针对有漏洞的代码可以进行漏洞攻击,并给出了防止漏洞攻击的几点建议.
  • 简单实现栈溢出实验(IDA)

    千次阅读 多人点赞 2020-10-10 13:53:22
    有关栈溢出的相关知识 最近学校讲到了栈溢出,并有一道很基础的题,在此可以记录一下,感兴趣的人可以了解了解
  • 栈溢出攻击 shellcode 编写引言shellcode 如何写思考有没有可以指定jmp的call呢?实现写汇编代码栗子: 引言 之前的文章写了原理在这:栈溢出攻击 原理 这次我们就讲讲shellcode怎么写,莫要再用msf当脚本小子了。 ...
  • (二)简易实现栈溢出实验(OllyDbg)

    千次阅读 2020-10-11 22:34:59
    上一篇博客讲到了栈溢出,关于做栈溢出实验,可使用的工具是反汇编工具。 之前讲到了IDA的实现: 点击进入IDA实现栈溢出博客 感兴趣的也可以看看。 现在说到老师上课可能更喜欢用的反汇编软件OllyDbg,来实现一下...
  • 栈溢出介绍 栈溢出实战 扩展: Linux系统保护机制 很多读者朋友在问这篇文章里的checksec是什么工具?这里先解释下,我们用的平台是...栈溢出实验程序: #include <stdio.h> #include <string.h> void suc
  • 栈溢出攻击实验 57119104 苏上峰 一.关闭防御措施 1.关闭地址随机化 在终端输入以下指令,关闭地址随机化,简化实验 sudo sysctl -w kernel.randomize_va_space=0 [外链图片转存失败,源站可能有防盗链机制,建议将...
  • 两个栈溢出的CVE漏洞实验

    千次阅读 2022-04-19 09:33:21
    缓冲区是指被程序内部使用或存放用户输入的内存区域,而溢出是指计算机向缓冲区填充数据时超出了缓冲区本身的容量,从而破坏程序的堆栈,造成程序崩溃或使程序转而执行其它指令,以达到攻击的目的。 由于堆栈是由...
  • 栈溢出原理

    2021-08-06 23:31:31
    文章目录栈溢出原理前言:栈一、栈溢出原理二、栈保护技术三、常发生栈溢出的危险函数四、可利用的栈溢出覆盖位置总结 前言:栈 栈是一种LIFO的数据结构。 应用程序有一到多个用户态栈。 栈自底向上增长,由指令...
  • 栈溢出

    2021-05-16 07:14:39
    8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?根据不同的操作系统,一个进程可能被分配到不同内存区域...动态分布和回收是堆区的特点区:用于动态的存储函数之间的调用关系,以保...
  • x64 ArchLinux栈溢出实验

    2020-10-21 12:47:34
    只要对编程有一定了解的同鞋应该都知道这个词,就拿C/CPP来说,在一个程序中他所有的局部变量与函数参数都是存在区里的比如 int fun(int i) { int a=0; return a; } 在这个简单的程序里变量i与变量a都存放在...
  • 一个栈溢出实验

    千次阅读 2016-07-26 01:18:56
    ———-一:ret2addr和ret2reg(绕过随机化)———- 测试环境:Ubuntu 12.04 调试工具:gdb(可用图形界面工具:insight)+ core文件 说明:若直接在gdb里执行程序,地址空间和...实验前设置core文件大小:u
  • 之前介绍的的缓冲区溢出导致站内变量值被修改(缓冲区溢出(栈溢出实验 之 改变栈内的变量) 本小节介绍通过缓冲区溢出调用函数,此外通过学习也对函数栈的了解有所加深,这里加上小段自己对函数栈的理解 函数栈...
  • 计算机系统(2) 实验四 缓冲区溢出攻击实验一、 实验目标:二、实验环境:三、实验内容四、实验步骤和结果(一)返回到smoke(二)返回到fizz()并准备相应参数(三)返回到bang()且修改global_value五、实验总结与...
  • 实验的学习目标是让学生将从课堂上学到的有关缓冲区溢出漏洞的知识进行实践,从而获得有关该漏洞的第一手经验。缓冲区溢出是指程序试图将数据写入预先分配的固定长度缓冲区边界之外的情况。恶意用户可利用此漏洞...
  • linux下的栈溢出实验

    千次阅读 2019-02-14 09:30:52
    linux下的栈溢出实验 关于操作系统的ASLR地址随机化 首先我们在实验之前需要了解以下ASLR机制。即linux平台下的地址随机化机制。它将进程中的某些内存空间地址进行随机化来增大入侵者预测目的地址的难度。从而降低被...
  • 栈溢出攻击的理解

    千次阅读 2014-12-08 18:29:55
    栈溢出攻击首次提出是在1996年,Aleph One发表了一篇名为Smashing the stack for fun and Profit的文章。介绍了一种在Linux/Unix系统,利用缓冲区溢出的方式来攻击目标程序来改变程序的执行方式的技术。该文章将以前...
  • 缓冲区溢出攻击实验(输出deadbeef)C语言题目源码尝试运行程序观察分析栈内部情况决定使用栈溢出实施使用vs2019打开反汇编使用反汇编构造payload得到结果 C语言题目源码 /* bufbomb.c * * Bomb program that is ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,660
精华内容 1,064
关键字:

栈溢出攻击实验