本实验根据 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.dll
中MessageBoxA
的地址。如下所示:
此时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版本
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);
}
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编辑
,原因: