首页
社区
课程
招聘
[已解决] [悬赏]《0day安全 软件漏洞分析技术》2.4.2实验问题 18.00雪花
发表于: 2017-12-13 12:11 2832

[已解决] [悬赏]《0day安全 软件漏洞分析技术》2.4.2实验问题 18.00雪花

2017-12-13 12:11
2832
各位好!
很荣幸能在这里向大家提问问题,小弟不才,还请大家多多包涵,多多指教!
本人在2.4.2节这个实验中出现了一个问题,
问:按照书中的操作,buffer[44]数组应该是(这里我写的是应该)溢出了,但是却无法覆盖EBP和返回地址,于是乎无法实现书中的效果!
分析:倒着来思考的话,如果没覆盖,那就是没溢出喽~ 为什么没溢出呢?我也不知道……

实验环境:
操作系统:windows xp sp2英文版
编译器:Microsoft Visual C++ 6.0英文版
实验源码:
#include <stdio.h>
#include <windows.h>
#define PASSWORD "1234567"
int verify_password(char *password)
{
    int authenticated;
    char buffer[44];
    authenticated = strcmp(password, PASSWORD);
    strcpy(buffer, password);
    return authenticated;
}

main()
{
    int valid_flag = 0;
    char password[1024];
    FILE * fp;
    LoadLibrary("user32.dll");//prepare for messagebox
    if(!(fp = fopen("password.txt", "rw+")))
    {
        exit(0);
    }

    fscanf(fp, "%s", password);
    valid_flag = verify_password(password);
    if(valid_flag)
    {
        printf("incorrect password!\n");
    }
    else
    {
        printf("Congratulation! You have passed the verification!\n");
    }
    fclose(fp);
}



下面是password.txt的内容,画红线部分是没有读进buffer数组里面,不知道为什么……

其中:0012FAF0是buffer数组的首地址 77D8050B是我本地MessageBoxA的函数地址

下面附上我的OllyICE的截图

如果使用11个4321填充buffer[44]是可以覆盖authenticated变量的


调用MessageBoxA不成功, 然后我就试着调用MessageBoxW成功了,原因可能是因为我的英文版的XP Pro Sp2为了支持中文而安装了语言包,导致调用MessageBoxA出了问题
截图:

但是,我卸载了语言包以及除去扩展字符支持,还是一样,无法调用MessageBoxA
然后我就使用了MessageBoxExA 能正常显示



[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
希望有大神能解释下,为什么MessageBoxA无法使用,以及无法覆盖返回地址的原因
2017-12-13 15:50
0
雪    币: 1298
活跃值: (662)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
请问你文本内容都没有覆盖ebp+4的返回地址,你后来又是怎么到messagebox弹窗的呢?还是你c++代码MessageBoxA(null,failwest,failwest,0)就有问题?你文本内容长度不够导致没有覆盖返回地址的呢?建议你用fread(password,1,1024,fp);替带你的fscanf(fp,  "%s",  password);试试。
2017-12-13 17:36
0
雪    币: 9731
活跃值: (3091)
能力值: (RANK:520 )
在线值:
发帖
回帖
粉丝
4

hello

函数名: fscanf
功 能: 从一个流中执行格式化输入,fscanf遇到空格和换行时结束,注意空格时也结束。

 

0B
VT (vertical tab)
垂直制表符

 

我觉得是函数fscanf 读入数据时遇到0x0b当成了空格截断的原因

 

图片描述

 

如上图字符串里插入0b fscanf截断了
希望能对你有帮助。

2017-12-13 23:33
0
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
netwind # hello 函数名: fscanf 功 能: 从一个流中执行格式化输入,fscanf遇到空格和换行时结束,注意空格时也结束。 0B VT (vertical tab) 垂直制表符 ...
非常感谢!
2017-12-14 15:12
0
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
netwind # hello 函数名: fscanf 功 能: 从一个流中执行格式化输入,fscanf遇到空格和换行时结束,注意空格时也结束。 0B VT (vertical tab) 垂直制表符 ...
确实是这样的,我使用了fgets,便可以完全读取文件里的内容了。
2017-12-14 15:25
0
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
netwind # hello 函数名: fscanf 功 能: 从一个流中执行格式化输入,fscanf遇到空格和换行时结束,注意空格时也结束。 0B VT (vertical tab) 垂直制表符 ...
人物:netwind  |  十年磨一剑    看过这篇文章  有幸有幸!
2017-12-14 15:48
0
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
ZombieBoy 请问你文本内容都没有覆盖ebp+4的返回地址,你后来又是怎么到messagebox弹窗的呢?还是你c++代码MessageBoxA(null,failwest,failwest,0)就有问题?你文本内 ...
谢谢啦~是文本内容长度不够导致没有覆盖返回地址
2017-12-14 16:04
0
游客
登录 | 注册 方可回帖
返回
//