【0Day】栈溢出漏洞基础——简单输入漏洞 & 修改返回函数

最近再次利用零零散散的时间,把第二章学完了。 感觉实验成功之后,还是非常开心的!嘿嘿。

书本上的理论可以很快的看完,但是真正实践的时候还是会出现一点问题的。一点点总结将在后面一起分享出来。

自己构造的漏洞代码,如果使用VS编译的话,debug版溢出了会报错,release版它自己把代码优化了,消除了溢出的漏洞。

看来好几年前的技术现在已经被防护的很彻底了呀。  所以说,学技术不能死学,要学习思想。

0x00 堆栈的基本原理

在调用一个call之后,堆栈的情况是这样的。

call中记录的是前栈帧的EBP。 这个时候:

比如这说个函数  int f(int a, int b){  int abc = 5 ; return abc; }

在汇编中,获取函数的局部变量和传入参数,都是利用EBP的相对地址的。

[b] 就相当于图中的 param1, 地址为EBP+C

[a] 相当于param2, 地址为EBP+8

调用函数f之后的指令地址为[return addr], 地址为EBP+4

声明的本地变量从EBP开始减,

局部变量[abc]相当于 local pa1,地址为EBP-4,依次类推。

ESP的作用就是堆栈的栈顶指针,一般用于调用函数的时候,压入参数。

此次漏洞构造的目的,就是要利用Function 函数中拷贝函数的溢出特点,把局部变量local pa1,return addr 改变成自己想要的值得目的。

0x01 简单的输入漏洞

构造的具有漏洞的代码如下:

 /*
 note:
1、找到存储aut,buffer的位置。 本例中:aut=[esp-C] buffer=[esp-14]
2、查看堆栈,到数据窗口中跟随。
3、根据具体情况构造对应的overflow代码 

 */
#include <string.h>
#include <stdio.h>
#define PASSWORD "123456"

int authen(char *password)
{
	int aut;
	char buffer[8];//add to be overflowed!!
	aut = strcmp(PASSWORD,password);
	strcpy(buffer, password);//overflow!
	return aut;
}

int main()
{
	char password[1024];

	while(1)
	{
		printf("please input the password:           ");
		scanf("%s",password);
		if( authen(password) )//输入的数小于123456,值00000001,覆盖00000000;反之,值FFFFFFFF,覆盖为FFFFFF00,,
		{
			printf("no!  you should try again!\n");
		}
		else
		{
			printf("Yes! you did it! \n");
			break;
		}
	}
	getchar();
	getchar();
	return 0;
}

想要挖掘这个代码中的漏洞,就是要看两点。是否有可以溢出的缓冲区?是否有可以向缓冲区填充数据的条件?

本代码中就是 buffer  和strcpy两个函数。我们的目的就是要通过向buffer填充数据,改变相邻变量aut的值为0.为0 表示密码比对成功。

溢出之前的堆栈:

溢出之后的堆栈,aut位被溢出成0了,表示字符串比较成功,为相等:

本例中要求输入的密码小于真正的密码,得到的值为正数1. 反之如果大于真正的密码,将得到负数 -1. 补码为 FFFFFFFF。 普通输入将无法正确的溢出,需借助文件输入。

0x02 修改函数返回地址

构造的漏洞代码:

 /*
 note:

 */
#include <string.h>
#include <stdio.h>
#define PASSWORD "123456"

int authen(char *password)
{
	int aut;
	char buffer[8];//add to be overflowed!!
	aut = strcmp(PASSWORD,password);
	strcpy(buffer, password);//overflow!
	return aut;
}

int main()
{
	char password[1024];
	FILE* fp;
	if(!(fp=fopen("password.txt","rw+")))//get the pass by read file
		return 0;
	fscanf(fp, "%s", password);
	if( authen(password) )
	{
		printf("no!  you should try again!\n");
	}
	else
	{
		printf("Yes! you did it! \n");
	}
	fclose(fp);
	getchar();
	getchar();
	return 0;
}

由于像地址这种特殊的字符"0x0041567",手打很难输入,因此,借助文件的输入。   这种构造完全是为了理解漏洞的原理来做的。

同样,也应该找到buffer的位置,同时还有返回地址的位置。

首先确定待跳转的地址。这里我们将在函数返回之后直接跳转到提示成功的地方。[0x00401467]

接着我们掌握堆栈结构,锁定具体哪一个位置填充我们的地址。

可以发现,每行四个字符,前面6行,24个字符,填充掉,后面四个字符表示返回地址。我们填上自己的地址。

构造的exploit文件时这样:

接着再执行。发现已经替换成我们的地址了。

显示执行成功了!

整理完之后还是感觉很有成就感的。

初步的漏洞理论学习。

下面是利用漏洞注入自己的代码,但是方法不是通用的。跟操作系统版本号,编译器等有关的。

时间: 2024-12-12 17:41:15

【0Day】栈溢出漏洞基础——简单输入漏洞 & 修改返回函数的相关文章

实战经验丨业务逻辑漏洞探索之活动类漏洞

活动类的漏洞大家一定听说过,比如之前拼多多APP出现重大BUG,用户可以在任何没有限制的情况下无限领取100元无门槛优惠券.据不完全统计,一晚上的时间直接导致了拼多多200多亿的优惠券面额损失. 其实很多平台都会通过参与活动赢取奖励的方式来吸引用户,或是使用资金.虚拟货币.积分等进行交易,然而如果这些功能没有设计好,会很容易造成重大的经济损失,比如像上述的拼多多案例. 那么今天我们就来学习一下业务逻辑漏洞探索之活动类漏洞的相关内容,希望对大家有所帮助. 注:本文中提供的例子均来自网络已公开测试的

浅谈APP漏洞挖掘之逻辑漏洞

作者:Can 联系方式:[email protected] 文章中若无特别说明,实例皆为本人自主挖掘. 转载请注明出处,本文仅为个人经验总结,介绍的并非所有方法,只是一些最常见的方法.如有错误,烦请指出. 0x00 简介 本文主要介绍APP漏洞挖掘中逻辑漏洞,包括任意用户密码重置,支付漏洞,任意用户未授权登录. 0x01 任意用户密码重置正文 首先,我们来看看任意用户密码重置. 方法一:密码找回的凭证太弱,为4位或6位纯数字,并且时效过长,导致可爆破从而重置用户密码. 这里我们来看一个实例,目前

php+mysql实现简单登录注册修改密码网页

本文为php+mysql实现简单登录注册修改密码网页,原文网址:http://www.jb51.net/article/98673.htm,感谢写此代码的人,亲测有效.感谢感谢 对于php和mysql的连接在许多blog上都有说明,为了将mysql中的查询,修改,插入等操作掌握,本文介绍了一下如何采用mysql做一个登录注册修改密码的网页. 其中,如下 1.登录-即为对数据库中的内容给予查询,并验证html中的信息与数据库是否匹配:2.注册-即为对数据库中的内容进行插入,注册帐号与密码:3.修改

iOS开发UI基础—简单的浏览器查看程序

iOS开发UI基础-简单的浏览器查看程序 一.程序实现要求 1.要求 2. 界面分析 (1) 需要读取或修改属性的控件需要设置属性 序号标签 图片 图片描述 左边按钮 右边按钮 (2) 需要监听响应事件的对象,需要添加监听方法 左边按钮 右边按钮 二.实现基本功能的程序 1 // 2 // YYViewController.m 3 // 03-图片浏览器初步 4 // 5 // Created by apple on 14-5-21. 6 // Copyright (c) 2014年 itcas

DartWeb基础—简单入门

DartWeb基础-简单入门 DartWeb的前面是Dart,所以需要先搭建好Dart开发环境,再进行下面的工作 下载Dartium浏览器 Dartium是Chromium的一个特殊的版本,里面包含Dart VM,使用Dartium意味着你不必将代码编译为JavaScript就能调试程序,直到开发完成后再将代码编译为JavaScript测试其他浏览器 Dartium下载地址-传送门 为以后方便开发,可以建立一个快捷方式到桌面 创建并完善应用 在根目录下新建index.html文件 <!DOCTY

网站漏洞修复之UEditor漏洞 任意文件上传漏洞 2018 .net新

UEditor于近日被曝出高危漏洞,包括目前官方UEditor 1.4.3.3 最新版本,都受到此漏洞的影响,ueditor是百度官方技术团队开发的一套前端编辑器,可以上传图片,写文字,支持自定义的html编写,移动端以及电脑端都可以无缝对接,自适应页面,图片也可以自动适应当前的上传路径与页面比例大小,一些视频文件的上传,开源,高效,稳定,安全,一直深受站长们的喜欢. 百度的UEditor文本编辑器,近几年很少被曝出漏洞,事情没有绝对的,总会有漏洞,这次被曝出的漏洞是.net版本的,其他的php

Apache Struts最新漏洞 远程代码执行漏洞预警 2018年11月08日

2018年11月8日,SINE安全监控检测中心,检测到Apache Struts官方更新了一个Struts漏洞补丁,这个漏洞是Apache Struts目前最新的漏洞,影响范围较广,低于Apache Struts 2.3.35的版本都会受到此次Struts漏洞的攻击,目前apache官方更新的漏洞补丁,主要是修复commonsfileupload上传库出现的安全问题,这个库可以远程执行代码,上传木马后门到网站服务器中去. Apache Struts 漏洞描述 某知名的安全组织向Apache St

典型漏洞归纳之解析漏洞

0x00 总览说明 服务器解析漏洞算是历史比较悠久了,但如今依然广泛存在.在此记录汇总一些常见服务器(WEB server)的解析漏洞,比如IIS6.0.IIS7.5.apache.nginx等方便以后回顾温习. 一.IIS5.x-6.x解析漏洞 使用iis5.x-6.x版本的服务器,大多为windows server 2003,网站比较古老,开发语句一般为asp:该解析漏洞也只能解析asp文件,而不能解析aspx文件. IIS 6.0解析利用方法有两种 1.目录解析 /xx.asp/xx.jp

PHP语言基础简单整理

1.开始结束标记<? ... ?> 2.定义变量:$变量名 例: $str="锦清笋";不需要指明数据类型 3.输出语句:(1)echo "hello world!";---echo命令(2)print();输出语句,是函数,有返回值.输出成功返回1,失败返回0.(3) printf();格式化输出字符串.例:printf("%d,%f",12,12.3); (4)sprintf();格式化拼接字符串,不是输出语句,只能将字符串拼接.