【栈溢出】2.修改函数返回地址

1.将输入数据长度再次增大,使其溢出到覆盖函数返回地址

输入4321432143214321431:

      此时0019FAD4已经被覆盖,正常情况下,函数返回retn执行时,栈顶元素刚好是返回地址,retn指令将返回地址压入到指令寄存器EIP中。由于找不到有效的指令地址,程序奔溃。若是这个将这个返回地址设置为有效的地址,程序就会跳转到设定的返回地址处执行。

报错:

2.指定函数返回地址

 将输入保存在.txt文件中,使用16进制编辑器修改输入值,完成指定返回地址设置。

将返回地址设置为通过验证congratultions:

成功:

注意:password.txt保存位置,fopen时权限设置。

#include <stdio.h>

#include<string.h>

#include<stdlib.h>

#define PASSWORD "1234567";

int verify(char *password)

{

    int authenticated;   //注意authenticated,buffer[]声明位置

    char buffer[8];

    authenticated = strcmp(password, "1234567");

    strcpy(buffer, password);//创造栈溢出的条件

    return authenticated;

}

int main()

{

    int valid_flag = 0;

    char password[1024];

FILE *fp;

fp=fopen("password.txt","rw+");

if(!fp)

{

exit(0);

}

          fscanf(fp,"%s", password);

    valid_flag = verify(password);

    if (valid_flag)

     {

       printf("incorrect!");

     }

     else

     {

         printf("congratultions!");

     }

 system("pause");

fclose(fp);

   

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值