首页
社区
课程
招聘
[原创]基础 栈溢出手工代码注入
发表于: 2023-4-3 23:44 12741

[原创]基础 栈溢出手工代码注入

2023-4-3 23:44
12741

本实验根据 0day 软件安全一书调试完成

加深对栈溢出的了解,锻炼动手能力,分享

此次实验所用的源码如下

这个程序很简单就是从当前目录,读取passwd.txt中的内容,并判断是否和程序中定义的PASSWORD相同。在verify_password函数中用strcpy函数构造了一个栈溢出漏洞。

首先使用VS++生成exe,然后在其目录下创建一个passwd.txt文件,如下图所示。
图片描述
使用Ollydbg打开程序进行调试,打开Ollydbg往上即可看见程序函数main跳转地址,和调用verfy_password函数地址,如下图:

图片描述

此处可以看见main函数和verify_password函数跳转地址。进入主函数,可以看见打开、读取文件,并将读取的内容进行压栈,然后再调用verify_password函数。如下所示

图片描述

F8 调用函数。进入函数内部。
图片描述
这里主要功能就是比较传进来的参数和1234567是否相同,然后使用strcpy将传进来的参数复制到buffer中。

这里查看栈区,可以看见函数执行完毕之后,EIP 会跳转到004010E4继续执行流程。这里栈空间存放函数返回地址的地址为:0012FB24

图片描述

由于我们源码中的buffer定义为44个字节,我们如果在passwd.txt写入44个字节,那么第45个隐藏的截断符'\0'会将我们的auth低字节中的1覆盖,从而突破密码的限制。

我们在passwd.txt中使用11组1234,这种一共44个字符,此时查看栈中情况
图片描述

由栈中的情况分析可以看见

也就是说,我们将passwd.txt中第53~56个字节改为0x0012FAF0可以引导EIP跳入我们输入的字符串开始取执行指令。

这一节我们手工构造shellcode,下一节再教大家怎么生成通用shellcode。

使用VC自带工具Dependency Walker获取user32.dllMessageBoxA的地址。如下所示:
图片描述

此时user32.dll的基址为:0x77D10000 , 而MessageBoxA的入口地址为:0x000407EA,那么MessageBoxA再内存中的地址为:0x77D507EA

使用OD生成调用MessageBoxA shellcode如下所示:

图片描述

弹窗shellcode为

因此我们可以用 010editor 和滑板指令90 来填充我们的shellcode。如下所示:
图片描述

此时运行我们的exe,成功弹出MessageBox弹窗如下所示:

图片描述

漏洞研究小白,目前正在跟着书学习。希望自己能持之以恒。大家一起共勉

操作系统: Windows XP SP2
编译器:   Visual C++ 6.0
编译选项: 默认编译选项
build版本:debug版本
操作系统: Windows XP SP2
编译器:   Visual C++ 6.0
编译选项: 默认编译选项
build版本:debug版本
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
 
#define PASSWORD "1234567"
 
int verify_password(char *password)
{
    int auth;
    char buffer[44];
    auth = strcmp(password,PASSWORD);
    strcpy(buffer,password);//over flowed here
    return auth;
 
}
 
void main()
{
    int valid_flag = 0;
 
    char passwd[1024];
    FILE *fp;
    LoadLibrary("user32.dll");
    if(!(fp = fopen("passwd.txt","rw+")))
    {
        exit(0);
    }
    fscanf(fp,"%s",passwd);
    valid_flag = verify_password(passwd);
    if(valid_flag)
    {
        printf("incorrect password !!!\n");
    }
    else
    {
        printf("Congratulation !!! you have passwd the  verification !! \n");
    }
 
    fclose(fp);
}
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
 
#define PASSWORD "1234567"
 
int verify_password(char *password)
{
    int auth;
    char buffer[44];
    auth = strcmp(password,PASSWORD);
    strcpy(buffer,password);//over flowed here
    return auth;
 
}
 

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2023-4-5 13:03 被Tray_PG编辑 ,原因:
收藏
免费 2
支持
分享
最新回复 (6)
雪    币: 3059
活跃值: (30876)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
图片挂了
2023-4-4 09:05
1
雪    币: 1099
活跃值: (1206)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
3
秋狝 图片挂了
111晚点补上,
2023-4-4 11:03
0
雪    币: 340
活跃值: (922)
能力值: ( LV9,RANK:220 )
在线值:
发帖
回帖
粉丝
4
Visual C++ 6.0?文艺复兴了?
2023-4-4 14:59
0
雪    币: 1099
活跃值: (1206)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
5
noword_forever Visual C++ 6.0?文艺复兴了?
没法,我太菜了,只能先在vs上调试
2023-4-5 13:03
0
雪    币: 340
活跃值: (922)
能力值: ( LV9,RANK:220 )
在线值:
发帖
回帖
粉丝
6
Tray_PG 没法,我太菜了,只能先在vs上调试
2023年了,有vs 2022 了
2023-4-5 14:08
0
雪    币: 1099
活跃值: (1206)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
7
noword_forever 2023年了,有vs 2022 了
okk,后面我争取都换成vs2019,或者vs2022吧
2023-4-5 16:49
0
游客
登录 | 注册 方可回帖
返回
//