网络安全实验一,栈溢出,更改返回地址,调用flag函数

题目及其代码

在源码里写了一个flag函数,让调用完vuln函数后返回到flag函数去执行

#include <stdio.h>
#include <unistd.h>//unistd.h为Linux/Unix系统中内置头文件

int vuln() {
 char buf[80];//存在越界可能
 gets(buf);//无限制输入,漏洞可利用
 return 0;
}

int flag(){
  printf("you got the flag!");
  return 0;
}

int main(int argc, char *argv[]) {
 vuln();
 return 0;
}

思路解析

vuln函数里的gets是一个明显的越界入口,可对buf的存储位置进行往高地址越界溢出,根据下图的栈帧示意可知:
在这里插入图片描述

我们通过对buf越界一定数量后可以达到对返回地址的修改,把返回地址更改到flag函数的入口地址,即让eip指针指向flag函数入口地址。
(eip寄存器表示了当前运行命令的位置)

代码调试及实验过程

具体调试的基本操作和界面参考第一篇文章:
进去后点击该文章目录:第一次调试

环境

VMware16
win xp sp3
vc6

所需工具

十六进制编辑器,本处使用的是Hex Editor Neo

创建工程,开始实验

1.代码写入

在这里插入图片描述

// test6.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>

int vuln() {
	
	char buf[80];
	gets(buf);
	return 0;
}

int flag(){
	printf("you got the flag!\n");
	return 0;
}

int main(int argc, char *argv[]) {
	vuln();
	printf("do you get the flag?\n");
	return 0;
}

2.进入调试界面

设置好断点,以及变量监控,此时涉及的变量有flag函数的地址,buf的地址:
在这里插入图片描述

根据变量监控,buf的开始地址为0x0012fedc,空间是80个单位,即如下图黑框所示:
在这里插入图片描述

其黑框下面一行中,0012ff80为寄存器的值,在局部变量结束时的位置都会存在,即栈底,004010ed是它的返回地址,我们可以随意输入一个数来看看这个返回地址是返回到哪:

在这里插入图片描述

输入结束继续跳转:
在这里插入图片描述

可以看到,其跳转回了主函数的调用vulp的下一条语句

3.更改返回地址

从上面我们已经找到了返回地址的位置,以及buf的开始地址,经过计算得知返回地址开始距离buf开始地址84个字节,返回地址占4个字节,需要编辑的字节总数为88个字节:

在这里插入图片描述

进入十六进制编辑器编辑出对应十六进制码,最后四个字节改为00401080即80104000(小端地址):

在这里插入图片描述

保存为txt后,复制到虚拟机和你的C语言文件编译连接后的.exe后缀的文件放在同一目录,一般在vc6的工作空间文件夹下的debug里面:

在这里插入图片描述

打开cmd,来到该文件目录下:
在这里插入图片描述

把txt文件作为参数传入到c语言的.exe文件中:

在这里插入图片描述

该修改后我们发现它输出了flag中的打印内容,即它已经执行了flag函数,但是同时你也会收到一个报错信息,原因是因为直接修改返回地址后c语言跳转到该地址执行完flag函数后return 0的时候没有一个正确的地址让它回到main函数里,因为原来回到main函数的返回地址已经被我们覆盖了,代码回到了一个错误的未知地址。

在这里插入图片描述

4.尝试不报错继续运行

对返回地址进行伪造,最终输出了主函数的打印值但仍然造成了报错,可能是更改后导致esp对应的栈顶回不到正确位置,或者调用flag后flag开头又创建了一个栈帧导致返回地址对不上,暂时未找到解决方案。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值