栈溢出 初级教学

2018-09-20  本文已影响0人  Zero_0_0

一.初探栈溢出

1.1 在首先在文件夹里面创建一个c的程序 StackOF.c 内容如下图

#include <stdio.h>
#include <string.h>

int main()
{
    puts("SO plz qive me your shellcode");
        char buffer[256];
        memset(buffer,0,256);     #清除缓冲区数据
        read(0,buffer,256);        #输入
        vul(buffer);               #调用
        return 0;    

}
void vul(char *msg)
{
    char buffer[64];
    memcpy(buffer,msg,128);
    return;

}

memset: 内存初始化
buffer: 缓冲一般指指针或者数组
vul:函数的调用
strcpy
1 strcpy只能复制字符串。
2 strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束。
3 strcpy不仅复制字符串内容,还会复制字符串的结束符。
1.2 在终端 输入vim StackOF.c创建文件 使用gcc -c ./stackOF.c完成编译。和1.3中的编译是一个效果
1.3 gcc编译:终端输入gcc -m32 -no-pie -fno-stack-protector -z execstack -o pwnme stackOF.c 将生成一个pwnme的组件

图片.png
1.4调试 在终端输入gdb pwnme
1.5在vul函数下断点:breakpoint vulb vul
进入汇编的窗口如下命令 图片.png
1.6运行函数r或者run都也以 稍等一会会 输入ni单步进入找到函数的入栈口,和出栈口。计算栈的空间的大小。 图片.png 图片.png
1.7使用命令查看汇编代码的地址i r edx查看入栈口的初地址和结束地址 用高字节-低字节得出 76
图片.png 1.buffer的起始地址 = 0xffffd110
2.buffer的终止地址 = 0xffffd15c
buffer的差值为76

二. 分析数据

注:ldd +程序查看文件的偏移地址是否一直在发生变化
1.加一条命令关闭系统的的地址随机化命令
echo 0 > /proc/sys/kernel/randomize_va_space
2.在终端运行pwnme文件试试

图片.png
3.查看漏洞开启的缓冲策略
图片.png

三.构建填充数据

思路;当客户输入字符串,当字符串超出给定的空间就发生,数据溢出。
我们可以可以构建一个数据段,让我们想要的数据安全的执行下来,libc文件就是我们需要查找的构建数据重要的参数。
看看我偷瞄的图 嘻嘻

图片.png

构建完成如下 图片.png

根据图我们可以知道,我们需要构建的一个可以填充的数据流
注;buffer=填充字节+返回地址+shellcode

四查找填充的数据的字节大小

注:首先引入libc文件,这是c语言在编译的是候生成的一个内置文件
1.怎么找到libc文件?
注:先编译-下断点-运行-查找libc文件的位置
2.gdb一种编译方法

图片.png 图片.png
上一篇下一篇

猜你喜欢

热点阅读