1,下面这段程序中,verify_password是验证密码的函数,我们要做的是把编译好的程序直接跳过程序验证流程。
#include <stdio.h>
#define PASSWORD "1234567"
int verify_password (char *password)
{
int authenticated;
authenticated=strcmp(password,PASSWORD);
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;
}
}
}
2,利用ollydbg打开上面这段程序编译好的程序,程序会自动在在4010D8处断下来;Main函数默认有三个参数,那么我们根据这个特点,在下面寻找main函数入口点
3,call 00401040处符合3个参数的特点,但是不一定对,所以在此处下F2断点,让程序执行到这里,然后F7进入到函数中,观察里面的汇编代码,法线此处就是main函数内部代码块。
test eax,eax; jnz short 401046含义是判断eax的值是否相等,如果不相等就跳转到401046处;这个地方是关键作用;
然后我们修改汇编代码 jnz short 401046变成jmp short 0040107F就可以完成任意输入字符,直接跳过验证