IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 网络安全实验一,栈溢出更改变量值使得判断通过,so can u find flag -> 正文阅读

[网络协议]网络安全实验一,栈溢出更改变量值使得判断通过,so can u find flag

虚拟机环境以及IDE

VMware16
win xp sp3
vc6

题目代码解析

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

void getFlag()//flag的位置
{
	printf("flag is here\n");
}
void foo(int num)//num为我们所需要去修改的变量
{
//num初始值0x12345678
	int result;
	char s;
	gets(&s);//gets有了输入的空间,栈溢出的漏洞在此
	result = puts(&s);
	//获取s内存地址并打印,会打印s存储数的十进制,result会变成0
	//result变成0会在文末解释,与本题关系不大
	if(num == 0x61616161)//当num==0x61616161的时候执行flag
	{
		getFlag();
	}
	else{
		
		puts("wrong flag");
	}
}
int main()
{
	setbuf(stdin, 0);
	setbuf(stdout, 0);
	setbuf(stderr, 0);
	//大部分pwn题都会有这个函数,用来设置IO缓冲区的,
	//第一个参数是文件流,第二个参数表示缓冲区,
	//一般在pwn题中的用法是setbuf(stdin, 0)表示标准输入取消缓冲区。
	puts("so, can u find flag?");
	foo(0x12345678);
	return 0;
}

关于setbuf作用的部分详情请参考
CTF PWN 题之 setbuf 的利用

思路

从代码分析看来,此题思路清晰,通过对s 的输入,gets不限制输入的长度造成栈溢出从而可以改变num 的值为0x61616161来达到判断通过的效果

实验步骤

1.打开虚拟机win-xp,在vc6里把代码输入

关于vc6的工程创建以及代码调试具体操作请参考我上一篇文章的内容:

网络安全实验一,栈溢出,数组溢出输出why u r here?!

在这里插入图片描述

代码附上:

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

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

void getFlag()
{
	printf("flag is here\n");
}
void foo(int num)
{
	int result;
	char s;
	gets(&s);
	result = puts(&s);
	if(num == 0x61616161)
	{
		getFlag();
	}
	else{
		
		puts("wrong flag");
	}
}
int main()
{
	setbuf(stdin, 0);
	setbuf(stdout, 0);
	setbuf(stderr, 0);
	puts("so, can u find flag?");
	foo(0x12345678);
	return 0;
}

2.调试断点设置

由于已经明确了漏洞在foo函数里,我们可以直接跳过main在foo函数里设置断点要方便些
在这里插入图片描述

然后就可以进入调试模式了

3.开始调试代码

在这里插入图片描述

执行到输入的时候按钮会变灰,此时需要调出黑框框进行输入

在这里插入图片描述

?我们先随便输入一个字符‘a’来看看是啥情况(s是char类型,只占1个字节,但实际上程序里给它分配了4个字节可能是为了补齐),前面已经有result声明了,我们在后面重新加一个

char x;

然后重新运行调试并进行变量监视:

在这里插入图片描述

我们可以看到result和x两个变量的地址分别是0x0012ff24和0x0012ff1c,把s的0x0012ff20夹在中间的,分别占据4个字节,char占4个字节可能是对齐限制

同时,从上图我们也能看到num的位置处于0x0012ff30,我们可以得知s和num的距离相差16个字节,:
在这里插入图片描述

0012FF3C位置存储的是寄存器ebx的值7FFD8000
0012FF28存储的是0012FF80是一个寄存器的值,在局部变量高地址的地方
0012FF30位置存储的是12345678,也就是foo传给num的0x12345678,在28个字节以内我们都可以进行自由修改,至于空出来的部分是什么暂时不得而知,但在其他代码中,7FFD8000前都会有8个字节的空余

我们可以退出调试,在输入界面输入28个a进行测试看看是否有影响

a的ASCII的十六进制是61

在这里插入图片描述

在这里插入图片描述

我们可以看到,num已经变成了0x61616161,且代码能正常运行,并且我们跳到了flag,作业到此结束,只要num部分全a其他的随意输入(不要太长)

关于result = puts(&s);中result值为0

汇编预览,来到该行代码
在这里插入图片描述
在这里插入图片描述

在执行前result的值还在是初始值,而监控视窗常量puts(&s)的值为0

下图展示了需要注意的几个量

在这里插入图片描述

经常调试的话应该知道真正改变result值的汇编命令为最后一行的

mov dword ptr[ebp-4],eax

前者 dword ptr[ebp-4]为result的位置,后者为eax寄存器的值,那么可以猜测这一步的时候eax的值为0所以赋给result的值也是0,
查看寄存器:
在这里插入图片描述

代码执行前,寄存器eax的地址不为0,可以猜测在中间某个部分的时候eax的值变为了0,在前面gets的汇编命令我们也能看到对eax的修改

可是,在展示出的汇编命令并没有对eax进行修改,我们可以猜测在call部分的调用puts命令的部分里面存在对eax的修改,我们把代码执行到该行然后点击step into:

在这里插入图片描述
在这里插入图片描述
点击取消

在这里插入图片描述

我们可以看到我们来到了puts的汇编命令部分,命令很多,我们可以一直下一步并监视eax的值知道eax发生改变

在这里插入图片描述

我们可以看到,在该行代码执行结束后eax变为了0,发现它对eax进行了对自己的异或,于是eax的值变为了0。但是,后面有没有操作eax我们并不清楚,但可以确定eax是在这一块部分里变化为0导致后面的result的值为0 。

在这里插入图片描述

该行结束后eax变为了0000000a。

在这里插入图片描述

再次变化。

具体位置就不进行细说了,在加载puts的汇编命令后eax变为了0,导致在最后的mov给result赋值时result为0。

在这里插入图片描述

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-10-17 13:08:02  更:2022-10-17 13:10:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:51:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码