1.什么是二进制攻击?
大家好,我现在计划在接下来的时间里发布一个“二进制Exploitation”系列的文章。不知道你是否知道其实这是一个在黑客空间中巨大而又核心的领域。在我开始之前,坦白说,对那些没有计算机背景的来说并不值得花这么多时间在这方面,但是我希望我能够尽可能以简单和容易的方式讲解。然而平铺直叙的罗列基础知识无趣死了,所以,敲重点!如果你有一个这方面好的基础,你一定会喜欢跟着我做的。
二进制漏洞攻击是一个在网络安全非常宽泛的主题,目的是发现程序中的漏洞并且攻击他,来获得shell控制全或者修改程序的功能。计算机能够理解的语言部分称为“二进制”。计算机以二进制操作,意味着存储数据和执行计算都只用0和1。一个比特二进制代表不二逻辑中的True(1)和False(0)。每一种语言,都有其特别的地方,同时很多时候他们也有许多程序语言的共性。二进制的原理是利用弱势转化为优势,即利用缺陷和漏洞来导致意外和不可预料的行为发生。
先修课程
编程基础 64位汇编 Linux终端使用
所以我们开始一个简单的基于堆的缓冲区溢出。
2.缓冲区溢出
这里有两种不同的缓冲区溢出攻击。一种是基于堆的,另一种是基于栈的缓冲区溢出。这两种情况,都是发挥了应用等待用户的输入的优势。它可以造成程序崩溃或者执行任意代码。一个缓冲区溢出发生当程序尝试将比他能够接收到的更多的数据充满内存(一个内存缓冲区)。攻击者通过覆写应用的内存执行缓冲区溢出问题。缓冲区溢出是一种软件应用常见的漏洞,他可以攻击实现远程代码执行RCE或者DoS攻击。最简单最长的缓冲区溢出出现在堆上。最重要的原因缓冲区溢出是编程语言的使用,没有自动的监视和现实内容的缓冲区或者基于堆的缓冲区溢出问题。这包括C和C++语言,下面给出一个例子。
3.漏洞C程序
#include <err.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> char *gets(char *); void abracadabra() { printf("Success..! Function called :D\n"); exit(0); } int main(int argc, char **argv) { struct { char buffer[64]; volatile int (*point)(); } hackvist; hackvist.point = NULL; gets(hackvist.buffer); if (hackvist.point) { printf("Function Pointer → %p\n", hackvist.point); fflush(stdout); hackvist.point(); } else { printf("Try Again\n"); } exit(0); }
如果你有一写C语言的编程基础那么你就明白上面的代码是如何运行的。如果还是存在着疑惑,
等待我来解释吧。
我们的目标:为了执行没有被调用的“abracadabra”函数
代码提供了一段函数“abracadabra”,却没有在任何地方调用。代码使用了一个大小为64的缓冲区和一个“*point”指针。并且指针的值设置为NULL,通过gets()函数
赋值&
。gets()
从标准输入(stdin)
读取字符,然后