绘画二进制0x000001攻击的艺术 【基于栈的溢出】

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)读取字符,然后

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值