od ida 栈溢出初体验

初次尝试,如有错误,请大佬指出。

编写了一个如下的程序,在函数verify_password中,由于拷贝函数

strcpy(buffer,password);//over flowed here!

没有对长度进行限制,所以存在一个溢出点。

配置:IDA 7.0社区版以及od 我爱破解7周年纪念版。(需要软件的可以去官网下载:od,ida)
环境:windows 10,vc6.0
(环境原因不行的,我这里有一个编译好的,上传到csdn了,没有积分的私戳我,发邮件给你)

  1. 源代码
#include <stdio.h>
#include <string.h>
#define PASSWORD "1234567"
int verify_password (char *password)
{
	int authenticated=1;
	char buffer[8];// add local buffto be overflowed
	// char buffer2[]="1234567812345678";// add local buffto be overflowed
	authenticated=strcmp(password,PASSWORD);
	strcpy(buffer,password);//over flowed here!
	return authenticated;
}
main()
{
	int valid_flag=0;
	char password[1024];
	while(1)
	{
		printf("please input password: ");
		scanf("%s",password);
		valid_flag = verify_password(password);
		if(valid_flag)
		{
			printf("incorrect password!\n\n");
		}
		else
		{
			printf("Congratulation! You have passed the verification!\n");
			break;
		}
	}
}
  1. 打开ida对反编译的代码进行分析,进入到main函数。并找到verify_password函数的入口,进入在这里插入图片描述

  2. verify_password函数的变量名字根据长度猜测,并修改。


4. 在我们大致了解反编译之后的代码的结构,我们打开od进行动态调试。先使用快捷键Ctrl+G调出跳转框,注意,此时鼠标应该在汇编代码位置。而跳转的参数为verify_password函数的入口地址。
在这里插入图片描述
5. 快捷键F9运行。到断点位置之后,F7单步调试。在cmd窗口输入abcdef。EBP存放的是栈底的地址,ESP是栈顶指针,以下设置要在以下代码执行完成之后设置。不了解的同学看看这篇文章

push ebp//保存上一个栈底
mov ebp,esp//将上一个栈的栈顶作为新的栈底
sub esp,0x4c//设置新的栈顶位置

在这里插入图片描述

  1. 执行到strcmp函数的前后3个关键步骤。

在这里插入图片描述
7. 执行到strcpy
在这里插入图片描述
8. 然后可以看到cmd中出现
在这里插入图片描述
9. 那么我们就要开始想象怎么来利用前面提到的漏洞绕过密码
在这里插入图片描述
要知道在内存中 函数verify_password的入栈顺序为
1. 形参password地址
2. verify_password返回地址
3. authenticated
4. buffer[8]
在这里插入图片描述

也就是说当buffer的大小足够大的时候,可以在完成字符串比较之后,将authenticated的值进行覆盖,那么返回的就是一个覆盖后的值。

我们不妨思考一下,buffer的大小为8,那么输入的字符长度为12的时候就可以完全覆盖掉,对吧?但是注意,C语言会将输入的字符,后面加上0x00作为截断,所以要将authenticated覆盖为00,那么可以输入一个8位的任意字符,因为此时截断0x00会恰好将authenticated的最后的0x01覆盖为0x00,又由于我们初始化authenticated的时候,前6bit已经变为0,所以authenticated整个值为0。
在这里插入图片描述

可以看到密码不是1234567,但是仍然显示登陆成功。
在这里插入图片描述

当然如果想无论初值是什么都可以覆盖,那么就要构造payload了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值