作业信息
这个作业属于那个班级 https://edu.cnblogs.com/campus/besti/2022-2023-1-CFAP
作业要求 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK13
作业目标 学习《C语言程序设计》第12章
作业正文 https://www.cnblogs.com/ni-yidan/p/16913050.html
教材学习内容总结
在《C语言程序设计》第十章“字符串”中,
* 字符串常量————一串以'\0'结尾的字符在C语言中被看作字符串,用双引号括起的一串字符是字符串常量,C语言自动为其添加'\0'结束符
* 字符串的储存————C语言没有提供专门的字符串数据类型,使用字符数组和字符指针来处理字符串。
1.字符数组的初始化
* 字符指针————字符指针就是指向字符串首地址的指针
pStr是一个指向常量存储区中的字符串的指针变量,而字符串保存在只读的常量存储区,可修改pStr的值(指向),但不可以对它所指向的存储单元进行写操作.
数组名str的值不可修改,是地址常量,而数组中存储的字符可以被修改。例如,str[0] = 'W';
* 字符串的访问和输入/输出
1.按字符逐个输入/输出
2.按字符串整体输入/输出
gets(str);
puts(str);
注:getchar(); /* 读走输入缓冲区中的回车符 */
* 字符串处理函数
strlen(字符串); ————计算字符串长度(不包括\0的实际字符的个数)
strcpy(目的字符串, 源字符串); ————字符串复制(例如,strcpy(str2, str1); 注意复制的方向!str2必须足够大!)
strcat(目的字符串, 源字符串); ————字符串连接(例如,strcat(str2, str1); str2必须足够大!)
strcmp(字符串1, 字符串2); ——————字符串比较(字符串不能用>,<,==比较大小,if (strcmp(str2, str1) == 0))————当出现第一对不相等的字符时,就由这两个字符决定所在字符串的大小,返回其ASCII码比较的结果值
* 向函数传递字符串————既可用字符数组作函数参数,也可用字符指针作函数参数。
从函数返回字符指针
教材学习中的问题
我对缓冲区溢出攻击并不是很了解,在网上查询了相关资料后得知其相关原理:
通过缓冲区溢出,覆盖返回地址。返回地址跳转到我们栈中恶意代码。这样便完成了缓冲区溢出攻击。
在查找资料,有一下几种实现的方法,首先应关闭防护机制:
1.内存地址随机化机制
0 - 表示关闭进程地址空间随机化。
1 - 表示将mmap的基址,stack和vdso页面随机化。
2 - 表示在1的基础上增加栈(heap)的随机化。
sudo sysctl -w kernel.randomize_va_space=0
2.CANNARY(栈保护)
canary是一种用来防护栈溢出的保护机制。其原理是在一个函数的入口处,先从fs/gs寄存器中取出一个4字节(eax)或者8字节(rax)的值存到栈上,当函数结束时会检查这个栈上的值是 否和存进去的值一致
gcc -o test test.c // 默认情况下,不开启Canary保护
gcc -fno-stack-protector -o test test.c //禁用栈保护
gcc -fstack-protector -o test test.c //启用堆栈保护,不过只为局部变量中含有 char 数组的函数插入保护代码
gcc -fstack-protector-all -o test test.c //启用堆栈保护,为所有函数插入保护代码
3.NX(DEP)
NX即No-eXecute(不可执行)的意思,NX(DEP)的基本原理是将数据所在内存页标识为不可执行,当程序溢出成功转入shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意指令。
gcc -o test test.c // 默认情况下,开启NX保护
gcc -z execstack -o test test.c // 禁用NX保护
gcc -z noexecstack -o test test.c // 开启NX保护
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
第一周 | 0/0 | 3/3 | 20/20 | |
第二周 | 105/105 | 2/5 | 20/40 | |
第三周 | 150/255 | 2/7 | 20/60 | |
第四周 | 210/465 | 2/9 | 20/80 | |
第五周 | 280/745 | 2/11 | 20/100 | |
第六周 | 320/1065 | 1/12 | 20/120 | |
第七周 | 400/1465 | 1/13 | 20/140 | |
第八周 | 400/1865 | 1/14 | 20/160 | |
第九周 | 400/2265 | 1/15 | 20/180 | |
第十周 | 400/2665 | 1/16 | 20/200 | |
第十一周 | 400/3065 | 1/17 | 20/220 | |
第十二周 | 360/3425 | 1/17 | 20/240 | |
第十三周 | 360/3785 | 1/18 | 20/260 |