password源码如下:
#include <iostream>
#include<string.h>
using namespace std;
#define password "12345678"
bool verifyPwd(char * pwd)
{
int flag;
flag=strcmp(password, pwd);
return flag==0;
}
int main()
{
bool bFlag;
char pwd[1024];
printf("please input your password:\n");
while (1)
{
scanf("%s",pwd);
bFlag=verifyPwd(pwd);
if (bFlag)
{
printf("passed\n");
break;
}else{
printf("wrong password, please input again:\n");
}
}
return 0;
}
1.g++ pwd.cpp –o pwd.exe生成pwd.exe,拖入下载好的ollydbg程序里。
1.1查找所有引用的字符串,很容易猜到密码是12345678;但我们不这样做,我们去跳转指令位置修改程序。
2.F8单步调试,发现运行到wrong password以后程序运行到了判断密码的功能区,并且不断提示输入密码错误,要求重新输入,所以我们不应该让程序从004014D1处运行到4014E1处,上面的 je short 004014E1便是关键语句。
3.将这个跳转指令注释掉即可
4.导出修改后的文件
5.运行修改后的pwd2.exe文件,发现程序无法运行;好吧,我修改je后面的地址到004014D3,即passed前的move语句,调试过程中运行,终于passed。
************************************************************************
5.2修改je为jnz也可以实现passed
***********************************************************************
5.3修改ZF标志,从1--->0.程序也可以passed。