栈溢出实验

本文通过一次具体的栈溢出实验,详细介绍了如何利用构造特定字符串覆盖函数返回地址,以触发预设函数。实验在CodeBlocks和UltraEdit环境下进行,通过修改password.txt文件的内容,使程序跳转至attack函数,实现对fun函数返回地址的覆盖。

实验目的

在掌握栈帧结构的基础上,学习栈溢出漏洞的基本原理。

完成功能

在函数的栈帧中,局部变量是顺序排列的,栈帧中还保存前栈帧EBP及返回地址RET等信息。构造password.txt。使得str在读取该文件后恰能够覆盖fun函数的返回地址,从而运行attack函数。

实验环境

CodeBlocks、UltraEdit

实验代码

#include <stdio.h>
void attack(){
  printf("Attacked!\n");
  exit(0);
}

void fun(){
   char password[6]="ABCDE";
   char str[6];
   FILE *fp;
   if(!(fp=fopen("password.txt","r"))){
       exit(0);
   }
   fscanf(fp,"%s",str);

   str[5]='\0';
   if(strcmp(str,password)==0)
    printf("OK!\n");
   else
    printf("NO!\n");
}

int main()
{
    fun();
    return 0;
}

实验过程

1.函数栈

EBP:栈底 存储着上一个栈的栈底EBP
ESP:栈顶 存储着系统栈的栈顶(函数栈形成是保存系统栈栈顶)

2.构造字符串

(1) 查看attack()函数的地址

在这里插入图片描述

(2) 查看fun()函数的ESP和EBP

在这里插入图片描述

(3) 标注内存图

在这里插入图片描述

(3) 构造字符串

如上图所示我们需要构造32个字符来覆盖到返回值,前28个用于覆盖str到EBP,在返回值处我们使用attack()函数的地址转化过来的字符(注意地址的高低位)

在这里插入图片描述

(3) 成功时的内存分布状况

在这里插入图片描述

实验结果

在这里插入图片描述在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值