OD入门 在不修改程序的情况下,取得合法验证

本文介绍了一种简单程序中的密码验证机制及两种绕过方法:一是通过调试工具修改寄存器状态;二是利用栈溢出漏洞,通过输入特定长度的数据覆盖验证标志。
这是一个比较简单的程序 源程序如下:
#include <stdio.h>

#define PASSWORD "1921512"

int verify_password (char *password)
{
	int authenticated;
	char buffer[32];

	authenticated=strcmp(password,PASSWORD);
	strcpy(buffer,password);

	return authenticated;
}

void 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("\nIncorrect password!\n\n");
		}
		else
		{
			printf("\nCongratulation!\n");
			printf("You have passed the verification!\n\n");
			break;
		}
	}
}

当你随意输入password,程序会进行验证。想要在不知道密码的情况下就通过验证该怎么做呢?


方法一:通过OD找到判断语句,修改寄存器Z,或者填充NOP

打开exe文件,通过调试,可以找到主函数入口点0x0040132B,按F2设断点,F7进入


进入后,输入密码,如图所示我随便输入了222,找到这个指令0x00401075,揭晓来他就会进行比较匹配,此时Z=0,要使接下来的0x40108A不跳转至Incorrect,可以把0x40108A的Z=1,继续按F8执行

我们会发现直接跳转至Congratula



已经成功取得合法验证!


方法二:利用栈溢出

这题已经给出了源代码,可知buffer为32,那么只需要输入第一个数不为1的32位数,覆盖authenticated,便可通过验证,一下“4321”为一单元:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值