首页
社区
课程
招聘
[原创]简单的栈溢出学习
发表于: 2019-9-21 11:33 7768

[原创]简单的栈溢出学习

2019-9-21 11:33
7768
先上示例代码
#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
const char PASSWORD[] = "15pb";
int main()
{
	int nFlag = 0;
	char szBuffer[8] = { 0 };
	char szPassWord[12] = { 0 };
	while (true) {
		printf("Please input password:");
		scanf("%s", szPassWord);
		nFlag = strcmp(PASSWORD, szPassWord);
		strcpy(szBuffer, szPassWord);
		if (!nFlag) {
			printf("Hello 15pb(Flag = %d)\n", nFlag);
			system("pause");
		}
	}
	return 0;
}
该代码正确的密码是 “15pb”,若输入成功,会输出 "Hello 15pb(Flag = 0)" ,否则需要重新输入
首先随意输入一个错误密码1234567890,单步调试,观察内存,可以看到字符数组 szPassWord 和 szBuffer,以及标识符 nFlag 的存储位置。
其中 szPassWord 占用12个字节,szBuffer 占用8个字节,但使用 strcpy 函数之后将 szPassWord 数组里的11个字节复制到 szBuffer 里,造成栈溢出。若输入的密码足够长,最终将 nFlag 的第一个字节修改为 00,则也会输出 "Hello 15pb(Flag = 0)" ,达到目的。
但要注意的是,根据 strcmp 函数,输入的密码的 ASCLL 码值要小于 "15pb",这样 nFlag 值是1,只要输入16个字符,其最后的字符串结束符0就能修改1为0
输入密码1515151515151515,查看内存, 发现 nFlag 被修改为0,能够输出
若输入密码1616161616161616, 其 ASCLL 码值大于原密码的 ASCLL 码,nFlag 为-1,在内存中是 ff ff ff ff,复制之后0修改第一位 ff 后变为 00 ff ff ff,就无法输出
#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
const char PASSWORD[] = "15pb";
int main()
{
	int nFlag = 0;
	char szBuffer[8] = { 0 };
	char szPassWord[12] = { 0 };
	while (true) {
		printf("Please input password:");
		scanf("%s", szPassWord);
		nFlag = strcmp(PASSWORD, szPassWord);
		strcpy(szBuffer, szPassWord);
		if (!nFlag) {
			printf("Hello 15pb(Flag = %d)\n", nFlag);
			system("pause");
		}
	}
	return 0;
}
该代码正确的密码是 “15pb”,若输入成功,会输出 "Hello 15pb(Flag = 0)" ,否则需要重新输入
首先随意输入一个错误密码1234567890,单步调试,观察内存,可以看到字符数组 szPassWord 和 szBuffer,以及标识符 nFlag 的存储位置。
其中 szPassWord 占用12个字节,szBuffer 占用8个字节,但使用 strcpy 函数之后将 szPassWord 数组里的11个字节复制到 szBuffer 里,造成栈溢出。若输入的密码足够长,最终将 nFlag 的第一个字节修改为 00,则也会输出 "Hello 15pb(Flag = 0)" ,达到目的。
但要注意的是,根据 strcmp 函数,输入的密码的 ASCLL 码值要小于 "15pb",这样 nFlag 值是1,只要输入16个字符,其最后的字符串结束符0就能修改1为0
输入密码1515151515151515,查看内存, 发现 nFlag 被修改为0,能够输出
若输入密码1616161616161616, 其 ASCLL 码值大于原密码的 ASCLL 码,nFlag 为-1,在内存中是 ff ff ff ff,复制之后0修改第一位 ff 后变为 00 ff ff ff,就无法输出
该代码正确的密码是 “15pb”,若输入成功,会输出 "Hello 15pb(Flag = 0)" ,否则需要重新输入
首先随意输入一个错误密码1234567890,单步调试,观察内存,可以看到字符数组 szPassWord 和 szBuffer,以及标识符 nFlag 的存储位置。
其中 szPassWord 占用12个字节,szBuffer 占用8个字节,但使用 strcpy 函数之后将 szPassWord 数组里的11个字节复制到 szBuffer 里,造成栈溢出。若输入的密码足够长,最终将 nFlag 的第一个字节修改为 00,则也会输出 "Hello 15pb(Flag = 0)" ,达到目的。

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

收藏
免费 1
支持
分享
最新回复 (18)
雪    币: 14525
活跃值: (17543)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
2
如果是栈溢出的话,需要楼主证明能通过漏洞直接得到shell,但是楼主好像没做下去啊。。。
2019-9-21 15:24
0
雪    币: 4522
活跃值: (785)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
pureGavin 如果是栈溢出的话,需要楼主证明能通过漏洞直接得到shell,但是楼主好像没做下去啊。。。
初学软件安全,只能做到这一步
2019-9-21 18:27
0
雪    币: 14525
活跃值: (17543)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
4
jieSh 初学软件安全,只能做到这一步
Explanation:
6a 0b                push 0xb 
58                     pop eax  
99                     cdq      
68 2f 73 68 00  push 0x68732f  
68 2f 62 69 6e  push 0x6e69622f
89 e3                mov ebx,esp    
31 c9                xor ecx,ecx    
cd 80                int 0x80
这是我在用的shellcode,目前是我能找到的最短的版本了(大神勿喷),楼主可以拿去学习
2019-9-21 18:49
1
雪    币: 4522
活跃值: (785)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
pureGavin Explanation: 6a&nbsp;0b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&a ...
谢谢大佬
2019-9-21 19:19
0
雪    币: 14525
活跃值: (17543)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
6
jieSh 谢谢大佬
有不懂的就问我,我尽量帮你
2019-9-21 21:15
0
雪    币: 432
活跃值: (141)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
大佬,请问一下,上面截图中用的软件是什么调试软件
2019-9-26 11:50
0
雪    币: 5649
活跃值: (3767)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
kanxueqwe 大佬,请问一下,上面截图中用的软件是什么调试软件
就是VS。。。
2019-9-26 15:58
0
雪    币: 15191
活跃值: (16857)
能力值: (RANK:730 )
在线值:
发帖
回帖
粉丝
9
15派?
2019-9-27 09:51
0
雪    币: 4522
活跃值: (785)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
有毒 15派?
是的
2019-9-27 10:16
0
雪    币: 768
活跃值: (236)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
#define _CRT_SECURE_NO_DEPRECATE
这个堆栈溢出,完全是程序员故意搞的(或者是演示性质的)。

去掉上面的define,在VS中不能编译通过。
2019-9-27 10:31
0
雪    币: 4522
活跃值: (785)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
zmrbak #define _CRT_SECURE_NO_DEPRECATE 这个堆栈溢出,完全是程序员故意搞的(或者是演示性质的)。 去掉上面的define,在VS中不能编译通过。
就是教学演示
2019-9-27 10:58
0
雪    币: 729
活跃值: (388)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
培训班的图文并茂,确实不错
2019-10-1 13:46
0
雪    币: 432
活跃值: (141)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
请问,为什么对于基于seh的漏洞在英文系统中测试shell code成功,在英文系统就不行啊
2019-10-14 18:53
0
雪    币: 432
活跃值: (141)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
大佬,请问为什么使用OD调试时候,对于中文系统nseh = "\xeb\x06\x90\x90" 装入内存时候\xeb\x06会变成一个字节\3F,从而不能出发漏洞
2019-11-20 14:55
0
雪    币: 4522
活跃值: (785)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
16
kanxueqwe 大佬,请问为什么使用OD调试时候,对于中文系统nseh = "\xeb\x06\x90\x90" 装入内存时候\xeb\x06会变成一个字节\3F,从而不能出发漏洞
,我只是初学者,不是大佬,您的问题我也不会
2019-11-23 08:09
0
雪    币: 432
活跃值: (141)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
jieSh [em_85],我只是初学者,不是大佬,您的问题我也不会
还是谢谢你
最后于 2019-11-23 12:19 被kanxueqwe编辑 ,原因:
2019-11-23 12:19
0
雪    币: 38
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
kanxueqwe 大佬,请问为什么使用OD调试时候,对于中文系统nseh = "\xeb\x06\x90\x90" 装入内存时候\xeb\x06会变成一个字节\3F,从而不能出发漏洞
1. 什么api读入的用户数据
2. debug

自查吧
2019-11-24 16:51
0
雪    币: 432
活跃值: (141)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
ooOOOoomxw 1. 什么api读入的用户数据 2. debug 自查吧
好的,多谢
2019-11-26 09:42
0
游客
登录 | 注册 方可回帖
返回
//