ch2:栈溢出,修改邻接变量,修改函数返回地址

来源:互联网 发布:趣医网络 编辑:程序博客网 时间:2024/06/14 16:45

实验环境:

操作系统Windows7IDEVC 6.0build版本debug


用于实验的C语言代码:

#include <stdio.h>#define PASSWORD "1234567"int verify_password(char * password){int authenticated;//add local buff to be overflowedchar buffer[8];authenticated=strcmp(password,PASSWORD);strcpy(buffer,password);return authenticated;}int 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;}}return 0;}


下面,修改邻接变量:

上述Win32程序中,在verify_password函数的栈帧中buffer数组和authenticated变量的位置

char buffer[0-3]char buffer[4-7]int authenticated

而buffer是由password通过strcpy得到的。可能会造成buffer[8]数组越界,覆盖authenticated变量的值。


当输入为"qqqqqqq"时,上面所说的栈帧数据如图:

因为"qqqqqqq" > "1234567"

所以authenticated的值为1。



下面将输入的数据变为"qqqqqqqq",buffer[8]应该全部被'q'填满。而后面的authenticated原本的值0x00000001则被字符串password的结束符'\0'覆盖为0x00000000。

单步调试执行完strcmp时,栈帧数据:

单步调试执行完strcpy时,栈帧数据:



执行结果:

绕过了密码的验证!


下面,修改函数返回地址:


栈帧数据:

char buffer[0-3]char buffer[4-7]int authenticated前栈帧EBP返回地址

覆盖之前的栈帧数据;

覆盖之后的栈帧数据:

返回地址被覆盖。

继续执行,报错,地址0x00323334的数据并不是合法的指令。

修改函数返回地址成功!

0 0