《0day安全学习笔记》——ChapterII——覆盖返回地址

来源:互联网 发布:大数据修炼 编辑:程序博客网 时间:2024/06/05 15:23

strcpy存在变量覆盖漏洞

通过输入的字符串,顺着栈一路覆盖至函数的返回地址,将恶意代码的入口地址覆盖到返回地址上。
这次的目的是将通过验证的入口地址覆盖返回地址:)

这里写图片描述

栈帧的分布情况,返回地址前有16个字节的数据,返回地址有四个字节,前16字节的数据随意覆盖,返回地址用入口地址覆盖。开搞:P

查找成功认证函数的入口地址

这里写图片描述

IDA查看函数逻辑,cmp后,zf位如果为0就会跳转到 loc_401120位置的函数,这就是我们想要函数跳转到地方。

这里写图片描述
获得我们需要的入口地址,构建输入的payload。

由于地址十六进制对应的ASCII码键盘是打不出的,所以要先用十六进制编辑器写好payload,以读文件的方式输入程序,修改一下程序:

#include<stdio.h>#include<string.h>#define PASSWORD "1234567"int verify_password(char *password){    int authenticated;    char buffer[8]; //add local buff to be overflowed    authenticated=strcmp(password,PASSWORD);    strcpy(buffer,password); //over flowed here!    return authenticated;}int main(){    int valid_flag=0;    FILE *fp;    if(!(fp=fopen("password.txt","rw+")))    {        return(0);    }    char password[1024];        printf("please input password:        ");        fscanf(fp,"%s",password);        valid_flag = verify_password(password);        if(valid_flag)        {            printf("no no no no!\n\n");        }        else        {            printf("yes yes yes!\n");               }        fclose(fp);    return 0;}

好了,我们已经知道入口地址为00401113。

这里写图片描述

用Winhex编辑,前16字节随便填,最后4个字节逆序输入地址,注意x86汇编采用小端序方式。

这里写图片描述

将字符串保存在password.txt中

这里写图片描述

emmmm,成功跳转到了验证字符串输出的地址,也成功输出了正确的字符串,程序崩溃是因为到程序最后返回时,栈平衡被打破,找不到返回到dos的地址,因此崩溃。

用OD查看覆盖的地址

这里写图片描述

可以看到,返回地址已经被入口地址覆盖

这里写图片描述

在返回的时候,成功读取了错误的返回地址。

思考一下

emmm,如果大家复制了我上面提供的代码,在32位的vc6.0中编译,最后是覆盖不了返回地址的:P
这里写图片描述

这个入口地址到底出了问题:)

好吧,其实是因为十六进制的20是空格,fscanf %s 遇到空格就会截断,因此后边的114000是穿不进去的:P

阅读全文
0 0
原创粉丝点击