标签:
1 #include <stdio.h> 2 #define PASSWORD "1234567" 3 int verify_password (char *password) 4 { 5 int authenticated; 6 char buffer[8]; 7 authenticated=strcmp(password,PASSWORD); 8 strcpy(buffer,password);//over flowed here! 9 return authenticated; 10 } 11 void main(void) 12 { 13 int valid_flag=0; 14 char password[1024]; 15 FILE * fp; 16 if(!(fp=fopen("password.txt","rw+"))) 17 { 18 exit(0); 19 } 20 fscanf(fp,"%s",password); 21 valid_flag = verify_password(password); 22 if(valid_flag) 23 { 24 printf("incorrect password!\n"); 25 } 26 else 27 { 28 printf("You have passed the verification!\n"); 29 } 30 fclose(fp); 31 }
编译成debug版本后,用ollydbg打开,
由图可知通过验证的程序分支的指令地址是0x00401122 如果把返回地址覆盖成这个地址。则程序将直接跳转到验证通过分支。
buffer[0~3]
buffer[4~7]
authenticated
前栈帧EBP
返回地址
在password.txt中,将4321作为一个输入单元,buffer[8]需要2个单元,第三个单元将authenticated覆盖,第四个将EBP覆盖,第五个单元将返回地址覆盖。
用十六进制编辑器UltraEdit将第五个修改为0x00401122即可实现跳转。
标签:
原文地址:http://www.cnblogs.com/ht-beyond/p/4334930.html