读书笔记3:0day安全:软件漏洞分析技术

实验内容:修改程序执行流程
引用书的原话:”用键盘输入字符的ASCII表示方位有限,很多值(如0x11、0x12等符号)无法直接用键盘输入,所以我们把实验的代码做了下改动,将程序的输入改由文件读取出字符串“
源码贴出:

#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#define PASSWORD "1234567"

int verify_password(char *password)
{
    int authenticated;
    char buffer[8];
    authenticated = strcmp(password,PASSWORD);
    strcpy(buffer,password);//over flowed here!!!
    return authenticated;
}
void main()
{
    int valid_flag = 0;
    char password[1024];
    FILE *fp;
    if(!(fp=fopen("password.txt","rw+")))        //判断文件是否存在
    {
        exit(0);        //不存在则直接exit出程序
    }
    fscanf(fp,"%s",password);        //从password.txt读取字符串,参数为文件指针,读取类型等..
    valid_flag = verify_password(password);
    if(valid_flag)
    {
        printf("incorrect password!\n");
    }
    else
    {
        printf("Congratulation! You have passed the verifycation!\n");

    }
    fclose(fp);
}

直接修改上个笔记的password进行修改这里使用ultraedit进行编写:
在这里插入图片描述
在verify_password函数指令中的strcpy后下段,此时已经完成了打开password.txt并且读出内容,把那个且放到buffer里面了,转到OD看下栈情况:
在这里插入图片描述
可以看到,我们已经成功修改了返回地址,让程序运行,测试下是否成功跳转:
在这里插入图片描述
跳转是成功了,不过我忘了修改了源码,我们重新定位下跳出成功验证的指令地址
在这里插入图片描述
小尾存放,是1F 11 40 00
在这里插入图片描述
结果:
在这里插入图片描述
我们已经成功了修改了流程,本来的返回地址应该是
在这里插入图片描述
F9执行完后终端可以看到,
在这里插入图片描述
以上实验结束,经过我们的修改,已经成功地修改了程序流程,使其直接跳转到我们的指令地址(即弹出验证成功的信息)

猜你喜欢

转载自blog.csdn.net/weixin_43084928/article/details/88597467