缓冲区溢出的利用(函数跳转)

大端序:数据的高位字节存放在地址的低端 低位字节存放在地址高端

小端序:数据的高位字节存放在地址的高端 低位字节存放在地址低端(例如x86)

栈增长方向:由高地址到低地址

缓冲区溢出:当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,使得溢出的数据覆盖在合法数据上,通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,造成程序崩溃或使程序转而执行其它指令。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
int k;
void fun(const char* input)
{
    char buf[8];
    strcpy(buf,input);
    printf("Address of input=%p\n",input);
    printf("Address of buf=%p\n",buf);
    k=(int)&input-(int)buf;
    printf("%s\n", buf);
}

void haha()
{
    printf("\nOK!success");
}

int main(int argc, char* argv[])
{
    printf("Address of foo=%p\n",fun);
    printf("Address of haha=%p\n",haha);
    void haha();
    int addr[4];
    char s[]="FindK";
    printf("Address of s=%p\n",s);
    fun(s);
    printf("%d\n", k);
    int go=(int)&haha;
    printf("Address of &haha=%p\n",&haha);
    //把haha()函数的地址分离成字节
    addr[0]=(go << 24)>>24; addr[1]=(go << 16)>>24; addr[2]=(go << 8)>>24;  addr[3]=go>>24;char ss[]="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
    for(int j=0;j<4;j++){
        ss[k-j-1]=addr[3-j];
    }

    fun(ss);
    return 0;
}

fun()函数中buf只分配了8字节的空间,通过写超出其长度的字符串ss,并传入void fun()函数对buf赋值,使调用fun()函数时的堆栈溢出,覆盖了返回地址,令构造的ss输入部分恰巧使覆盖返回地址部分的内容正好指向haha()函数入口,这样程序就不会返回之前的步骤(也就是主函数中调用fun()函数下边的return指令),而是进入了haha()函数,同时执行haha()函数中的printf("\nOK!success")指令,在屏幕上打印出OK!success

内存模型:

00401019 ----haha

00401005 ----fun

..........................

0012FF68 ----s="FindK"

..........................

0012FF30 ----ss="aaaaaaaaaaaaaaaaaaaaaaaa"

..........................

0012FEDC----input (&s,&ss)

...(3byte)         此处4bytes被新的地址值覆盖,将跳转haha

0012FED8----  函数返回地址//当调用一个函数的时候,首先是参数入栈,然后是返回地址

....(4byte)

0012FED3 ----buf[7]

......(6byte)

0012FECC ---- buf[0]

时间: 2024-10-02 00:13:15

缓冲区溢出的利用(函数跳转)的相关文章

缓冲区溢出分析第03课:缓冲区溢出的利用

前言 上次我们已经讨论了缓冲区溢出的原理,而这次我们需要利用这个原理来构造条件,从而利用这个漏洞. 其实缓冲区溢出漏洞的利用主要是需要解决以下三个问题: 1.精确定位返回地址的位置 2.寻找一个合适的地址,用于覆盖原始返回地址 3.编写Shellcode到相应的缓冲区中 这次我们就结合实验程序,来解决上述三个问题,实现漏洞的利用. 精确定位返回地址的位置 缓冲区溢出利用的第一步,就是需要我们精确定位返回地址的位置.由于我们这次的程序比较简单,所以通过错误提示对话框,我们就能够判定返回地址的位置了

数据库缓冲区溢出漏洞原理(栈)

背景 在数据库系统中已经发现了许多安全漏洞,其中比较严重且危害性比较大的有:缓冲区溢出和SQL注入2种. SQL注入主要依赖于结构化查询语言,每种数据库略有出入:SQL注入漏洞的利用,最主要的威胁是提权:后台维护人员或黑客攻击,可以借此获得DBA权限.需要说明的是,这里所说的SQL注入并不是应用系统的SQL注入,而是数据库自身的注入漏洞,这种漏洞比应用系统的注入漏洞危险性更高:对于SQL注入漏洞的存在,主要是由于数据库中提供的系统或用户函数存在的参数检查不严和语句执行的缺陷.SQL注入漏洞不是本

缓冲区溢出基础知识

缓冲区理论学习PE文件(进程)装入内存:PE文件(进程)在内存中按照功能大致划分4个部分(1)代码区(程序段) .text 主要存储被装入执行的二进制代码,ALU会到这个取指令并执行,这个段通常是只读,对它的写操作是非法的.(2)数据区 .data 主要是存储的全局变量,主要存储静态数据.(3)堆区 程序在堆区可以动态的请求分配一定大小的内存,并在用完后归还给堆区,动态分配和回收是堆区的主要特点,主要存储动态数据.(4)栈区 用于动态的存储函数之间的调用关系,以保证被调用函数在返回时恢复到母函数

PCMan FTP Server缓冲区溢出漏洞分析与利用

简要介绍 这个软件是台湾国立阳明大学医学系的一个学生在大四的时候写的,这个漏洞是有CVE的(CVE-2013-4730),软件应该还挺普及的,这是一个缓冲区溢出漏洞 具体exp可以点这里 实验用poc(其实这里直接对USER命令溢出都是可以的,即不用知道账号密码即可远程代码执行,USER命令的buf距离返回地址是2000) import socket as s from sys import argv # if(len(argv) != 4): print "USAGE: %s host <

CVE-2017-6465 FTPShell Client 6.53之缓冲区溢出利用

0x00.前言 FTPShell是一款国外Windows平台下比较流行的FTP服务工具,截至本文客户端最新版6.53下载地址:http://www.ftpshell.com/downloadclient.htm# 实验环境:VMWare + WinXP SP3 EN Vulnerable App 获取地址:http://www.ftpshell.com/downloadclient.htm# 0x01.利用 该缓冲区溢出漏洞发生在客户端与FTP服务端初始化认证连接阶段,首先实验环境下安装好 FT

小白日记17:kali渗透测试之缓冲区溢出实例-windows,POP3,SLmail

缓冲区溢出实例 缓冲区溢出原理:http://www.cnblogs.com/fanzhidongyzby/archive/2013/08/10/3250405.html 空间存储了用户程序的函数栈帧(包括参数.局部数据等),实现函数调用机制,它的数据增长方向是低地址方向.堆空间存储了程序运行时动态申请的内存数据等,数据增长方向是高地址方向.除了代码段和受操作系统保护的数据区域,其他的内存区域都可能作为缓冲区,因此缓冲区溢出的位置可能在数据段,也可能在堆.栈段.如果程序的代码有软件漏洞,恶意程序

CSAPP缓冲区溢出攻击实验(下)

CSAPP缓冲区溢出攻击实验(下) 3.3 Level 2: 爆竹 实验要求 这一个Level的难度陡然提升,我们要让getbuf()返回到bang()而非test(),并且在执行bang()之前将global_value的值修改为cookie.因为全局变量与代码不在一个段中,所以我们不能让缓冲区一直溢出到.bss段(因为global_value初始化为0,所以它会被放在.bss而非.data段以节省空间)覆盖global_value的值.若修改了.bss和.text之间某些只读的段会引起操作系

缓冲区溢出分析第08课:MS06-040漏洞研究——动态调试

前言 经过上次的分析,我们已经知道了MS06-040漏洞的本质,那么这次我们就通过编程实现漏洞的利用. 编写漏洞利用程序的框架 这里我使用的是VC++6.0进行编写,需要将包含有漏洞的netapi32.dll文件与工程文件放置在同一个目录下.程序如下: #include <windows.h> typedef void (*MYPROC)(LPTSTR, ...); int main() { char Str[0x320]; char lpWideCharStr[0x440]; int arg

缓冲区溢出分析第09课:MS06-040漏洞研究——深入挖掘

前言 经过前两次的分析,我们已经对Netapi32.dll文件中所包含的漏洞成功地实现了利用.在系统未打补丁之前,这确实是一个非常严重的漏洞,那么打了补丁之后,这个动态链接库是不是就安全了呢?答案是否定的.即便是打了补丁,虽说我们之前所分析的漏洞已被补上,但是这个程序中依旧存在着其它的问题. 对漏洞函数进行静态分析 我们之前所研究的Netapi32.dll的大小为309,008 字节,补丁后的文件大小为309,760 字节.我们用IDA Pro载入打过补丁后的DLL文件,找到之前出现问题的函数位