漏洞利用概述

当我期待继续讨论该主题时,让我告诉您有关漏洞的一些历史,理论和实践。 到现在为止,我们都听说安全漏洞可能会花费很多,我们都知道我们必须保持软件最新,我们都知道很多更新是由安全错误引起的。 但是今天,我将告诉您一些有关如何发现和利用这些错误的信息🙂但是,在此之前,我们将澄清一些细节,以便获得更好的概述。

在开始之前

首先,我想告诉您,我们将专注于我学会利用的第一个漏洞,即已知的 缓冲区溢出,在此漏洞中,我们利用缺乏内存验证的方式来做有趣的事情🙂但让我们对其进行更多说明。

这不会是现实世界的情况

我不能教他们破坏他们看到的任何程序-首先是因为这对他们的计算机很危险,其次是因为这将花费比我通常的单词更多的时间。

我们去八十年代

我将向您展示我可以在笔记本电脑上进行操作的内容,但这并不意味着今天可以通过简单的方式完成它-许多概念已经被利用了很多次,以至于有新的保护方法和新方法可以逃避它们已经出现了😛但这使我们回到了同一个地方,没有空间可以告诉所有人🙂

它可能无法在您的处理器上运行

尽管我将使用一个非常简单的示例,但我希望从一开始就很清楚,它的细节如此之多,千差万别,如果您想尝试的话,它可以和我一样出现,也可能无法达到预期的效果🙂但是您可以想象,在这个领域中我无法解释这一点,特别是因为通过本介绍,我已经讲了300多个字,所以我们直截了当地说。

什么是 缓冲区溢出

为了回答这个问题,我们首先必须了解这种结合的前半部分。

缓冲区

由于一切都与计算机中的内存有关,因此逻辑上必须有某种类型的信息容器。 当我们谈论 输入 输出,我们直接谈到 缓冲区。 为了简短起见, 缓冲 这是定义大小的存储空间,我们将在其中存储大量信息,简单simple

顾名思义,当缓冲区填充的信息超出其容纳量时,就会发生溢出。 但是为什么这很重要?

也称为栈,它们是一种抽象的数据类型,我们可以在其中 叠 信息,它们的主要特征是它们具有顺序 LIFO(后进先出)。 让我们想一想一下一叠盘子,我们将它们一个接一个地放在顶部,然后从顶部一个接一个地取出,这就是我们放置的最后一块盘子(那一块在上面) )是第一个盘子,显然,如果我们一次只能拿出一个盘子,而我们决定按以下顺序去做,那我们将要拿出什么?

现在您已经知道了这两个概念,我们必须将它们整理好。 堆栈很重要,因为我们运行的每个程序都有自己的程序 执行栈。 但是这个堆栈有一个 特色长大。 您唯一需要了解的是,在程序运行时,当调用函数时,堆栈从内存中的数字X变为数字(Xn)。 但是,为了继续下去,我们必须理解另一个概念。

指针

这个概念使许多程序员在进入C语言世界时就发疯了,实际上C编程的强大功能部分是由于使用了指针。 为了简单起见,有一个指针 指向一个内存地址。 这听起来很复杂,但并不复杂,我们的机器中都装有RAM,对吗? 好吧,这可以定义为 块的连续排列,这些位置通常以十六进制数表示(从0到9,然后从A到F,例如0x0、0x1、0x6、0xA,0xF,0x10)。 奇怪的是,这里是0x10 没有 等于10😛如果将其转换为十进制,将与说15相同。这在开始时也会使一个以上的混淆,但让我们开始吧。

记录

处理器可以与许多 记录,用于将位置从物理内存传输到处理器,对于使用64位的体系结构,寄存器的数量很大且难以在此处描述,但为便于理解,寄存器就像指针一样,它们指示其他内容,一个内存空间(位置)。

现在练习

我知道到目前为止,要处理的信息很多,但实际上,它们是一些复杂的问题,我试图以一种非常简单的方式进行解释,我们将看到一个使用缓冲区的小程序,并且打破它来了解有关溢出的知识,显然这不是一个真正的程序,我们将“逃避”当今使用的许多对策,只是为了展示things之前的工作方式,因为其中有些原则对于学习更复杂的事物是必不可少的

GDB

毫无疑问,这是一个出色的程序,是C程序员最常用的程序之一,它有许多优点,它使我们能够看到到目前为止我们一直在谈论的所有内容,寄存器,堆栈,缓冲区等。让我们看一下我们将用于示例的程序。

重新输入.c

拥有。 克里斯托弗·迪亚兹·里维罗斯(Christopher Diaz Riveros)

这是一个相当简单的程序,我们将使用该库 stdio.h 以便能够获取信息并将其显示在终端中。 我们可以看到一个名为 return_input 产生一个 缓冲 叫 排列,长度为30 字节 (char数据类型为1个字节长)。

功能 gets(array); 通过控制台和功能请求信息 printf() 返回数组的内容并在屏幕上显示。

用C编写的每个程序都以函数开头 main(),它将仅负责调用return_input,现在我们将编译该程序。

拥有。 克里斯托弗·迪亚兹·里维罗斯(Christopher Diaz Riveros)

让我们来看看我刚才所做的事情。 选项 -ggdb 告诉gcc使用gdb信息编译程序,以便能够正确调试。 -fno-stack-protector 这是一个显然不应该使用的选项,但我们将要使用它,因为否则将有可能在堆栈中生成缓冲区溢出。 最后,我测试了结果。 ./a.out 它只是运行我刚刚编译的内容,它要求信息并返回它。 运行🙂

警告

另一个注意这里。 您能看到警告吗? 显然,当我们使用代码或编译时,这是要考虑的事情,这是显而易见的,并且今天很少有具有该功能的程序 gets() 在代码中。 Gentoo的一个优势是通过编译每个程序,我可以看到可能出了什么问题,一个“理想”的程序不应该包含它们,但是您会惊讶地发现有这么多大型程序具有这些警告,因为它们非常大,很难跟踪同时出现许多警告时的危险功能。 现在,如果我们继续

调试程序

拥有。 克里斯托弗·迪亚兹·里维罗斯(Christopher Diaz Riveros)

现在这部分可能有点令人困惑,但是由于我已经写了很多东西,所以我无力解释所有内容,如果您看到我的进度太快,那么请抱歉sorry

撤防代码

让我们先看一下编译后的机器语言程序。

拥有。 克里斯托弗·迪亚兹·里维罗斯(Christopher Diaz Riveros)

这是我们主要功能的代码 组装,这就是我们的处理器所了解的,左侧的行是内存中的物理地址, <+ n> 它被称为 抵消,基本上是从函数(main)开始到该语句(称为 操作码)。 然后我们看到指令的类型(push / mov / callq…)和一个或多个寄存器。 综上所述,可以说是指示,其后是源/始发地和目的地。 <return_input> 指的是我们的第二个功能,让我们看一下。

返回_输入

拥有。 克里斯托弗·迪亚兹·里维罗斯(Christopher Diaz Riveros)

这有点复杂,但是我只想让您检查几件事,有一个标签叫做 <gets@plt> 最后一个操作码称为 retq 指示函数结束。 我们将在函数中放置几个​​断点 gets 另一个在 retq.

拥有。 克里斯托弗·迪亚兹·里维罗斯(Christopher Diaz Riveros)

运行

现在,我们将运行程序以查看操作如何开始。

拥有。 克里斯托弗·迪亚兹·里维罗斯(Christopher Diaz Riveros)

我们可以看到出现了一个小箭头,指示操作码所在的位置,我希望他们将方向 0x000055555555469b,这是呼叫后的地址 return_input 在功能上 main ,这一点很重要,因为这是您收到完程序后应该返回的程序 输入,让我们进入该功能。 现在我们要在进入功能之前检查内存 gets.

拥有。 克里斯托弗·迪亚兹·里维罗斯(Christopher Diaz Riveros)

我已经将main函数放回给您,并且由于您所看到的,我突出显示了我所指的代码。 内在性 已经分为两个部分,我希望您考虑到方向 0x7fffffffdbf0 (第一个突击队在左边 x/20x $rsp),因为这是我们用来检查获取结果的位置,所以让我们继续:

破坏程序

拥有。 克里斯托弗·迪亚兹·里维罗斯(Christopher Diaz Riveros)

我强调了那些 0x44444444因为它们代表了我们的Ds🙂现在我们已经开始添加 输入 到程序中,正如您所看到的,我们离所需地址只有两行,我们将对其进行填充,直到紧接在上一步中突出显示的地址之前。

改变返回路径

既然我们已经设法在代码的这一部分输入了表示函数返回的内容,那么让我们看看如果更改地址🙂而不是转到紧跟在刚才的代码之后的操作码的位置,会发生什么情况,您认为如果我们回到 return_input? 但是为此,有必要用二进制写我们想要的地址,我们将使用函数来完成 printf 来自bash🙂

拥有。 克里斯托弗·迪亚兹·里维罗斯(Christopher Diaz Riveros)

现在我们已经收到了两次信息-肯定不是为此编写的程序,但是我们设法破坏了代码并使其重复了原本不应该做的事情。

感言

这个简单的变化可以认为是 利用 非常基础🙂他设法打破了程序,做了我们希望他做的事情。

这只是几乎无限的要查看和添加的事物列表中的第一步,除了简单地重复执行命令外,还有许多方法可以添加更多事物,但是这次我写了很多东西 外壳编码 我要说的不仅仅是文章,而是完整的书。 抱歉,如果我无法进一步浏览自己想要的主题,但是肯定会有机会🙂问候和感谢。


发表您的评论

您的电子邮件地址将不会被发表。 必填字段标有 *

*

*

  1. 负责数据:MiguelÁngelGatón
  2. 数据用途:控制垃圾邮件,注释管理。
  3. 合法性:您的同意
  4. 数据通讯:除非有法律义务,否则不会将数据传达给第三方。
  5. 数据存储:Occentus Networks(EU)托管的数据库
  6. 权利:您可以随时限制,恢复和删除您的信息。

  1.   2p2

    更加直接。 少写,专注于重要的事情

    1.    克里斯·阿德

      嗨,谢谢你的评论。

      说实话,我已经削减了很多想法,但即使如此,在我看来,我也留下了最基本的想法,以便那些没有编程知识的人可以得到一个想法。

      问候

      1.    匿名

        问题在于,那些没有编程知识的人不会发现任何东西,因为一开始它太复杂了,但是那些懂得编程的人会更直接。

        我想您无法覆盖所有人,您必须选择,在这种情况下,您犯了要覆盖很多内容的想法。

        顺便说一句,我告诉你是建设性的批评,我喜欢这些话题,我希望你继续写文章,恭喜!

    2.    匿名

      我想同样的事情

      1.    克里斯·阿德

        非常感谢你们!! 当事实是阅读这些文章的编程水平较高的人数很少(至少可以根据评论推断得出)时,一定很难理解如何吸引目标受众。

        我当然想简化一些需要广泛了解的知识。 我希望您能理解,因为我只是从写博客开始,所以我还没有发现读者知道并理解我所说的确切信息。 这将使说实话容易得多🙂

        我将在不降低格式个性化的情况下,尽量缩短其使用时间,因为将编写方式与内容分开比想象中的要复杂一些,我至少将它们联系在一起,但我想最终我将能够添加行而不是剪切内容。

        问候

  2.   马里奥

    您在哪里可以进一步了解该主题? 有推荐的书吗?

    1.    克里斯·阿德

      该示例摘自Chris Anley,John Heasman,Felix Linder和Gerardo Richarte的《 The Shellcoder's Handbook》,但是为了进行64位翻译,我必须了解自己的体系结构,《英特尔开发人员手册》第2卷和第3卷是相当可靠的来源。 阅读带有'info gdb'命令的GDB文档也是很好的。要学习Assembly和C,有很多非常好的书,除了Assembly的书有些陈旧,因此还有很多空白需要填充键入文档。

      由于各种原因,shellcode本身如今已不再有效,但是学习新技术仍然很有趣。

      希望能有所帮助🙂问候

  3.   弗兰兹

    好文章,老博客 desdelinux 又重生了 =)
    当您说远程外壳不够有效时,是指旨在缓解攻击的对策,他们将其称为进攻性安全。
    问候并保持

    1.    克里斯·阿德

      非常感谢Franz🙂非常客气的话,实际上,我的意思是今天的Shellcoding比我们在这里看到的要复杂得多。 我们拥有ASLR(随机存储器位置生成器)堆栈保护器,各种措施和对策,这些措施和措施限制了可以注入到程序中的操作码的数量,这仅仅是开始。

      问候,

  4.   自由软件

    您好,您是否还会做另一部分扩展主题? 这真有趣

    1.    克里斯·阿德

      您好,该主题当然很有趣,但是我们要采取的复杂性级别会很高,可能涉及大量的帖子,以解释了解彼此的各种先决条件。 我可能会写关于它的文章,但不会是下面的文章,在继续之前,我想写一些话题。

      问候,谢谢分享

  5.   仙人掌

    很好! 您正在贡献出色的帖子! 一个问题,我正在读一本书“通过笔测试确保安全性”来开始IT安全性工作。 推荐这本书吗? 您如何建议我开始询问这些问题?

    1.    克里斯·阿德

      仙人掌,您好,这是一个有关漏洞的整个世界,而其他人,说实话,它很大程度上取决于引起您注意的因素以及您的需求,IT经理不需要像笔测试者一样知道,或脆弱性调查员或法医分析员,灾难恢复团队拥有非常不同的技能。 显然,他们每个人都需要不同水平的技术知识,我建议您开始确切地发现自己喜欢的东西,并开始吞噬书籍,文章和其他书籍,最重要的是,即使阅读的内容过时,也要练习阅读的所有内容,最终将有所作为。
      问候,

  6.   艾岑

    嘿。
    非常感谢您解释该主题,并评论我们提供了《 Shellcoder的手册》,以获取更多信息。 我已经有待读的书😉