栈溢出实验
实验目的
在掌握栈帧结构的基础上,学习栈溢出漏洞的基本原理。
完成功能
在函数的栈帧中,局部变量是顺序排列的,栈帧中还保存前栈帧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) 成功时的内存分布状况

实验结果


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

被折叠的 条评论
为什么被折叠?



