这是一个比较简单的程序 源程序如下:
#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”为一单元: