软件安全实验——pre3
Posted 大灬白
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了软件安全实验——pre3相关的知识,希望对你有一定的参考价值。
目录标题
1.
main()
{
int num=0x41414141;
printf("Before: num = %#x \\n", num);
printf("%.20d%hn\\n", num, &num);
printf("After: num = %#x \\n", num);
}
查看这段代码的执行结果,解释%.20d和%hn的含义。
解释:
%.20d:%m.n格式中m为输出宽度,n为精度控制。d表示以十进制形式输出带符号整数,所以解释是为输出精度为20的整形量。
%hn: h表示按短整型量输出,%n并不告诉printf()显示什么内容,而是将已输出的字符个数放入到变元指向的变量中。在printf()调用返回后,这个变量将包含一个遇到%n是字符输出的数目。%n格式符返回的是应该已经输出的字符个数,而不是实际输出的字符个数。
%hn格式符表示的是按短整型应该已经输出的字符个数,而不是实际输出的字符个数。
2.解释linux用root执行下面这条命令sysctl -w kernel.randomize_va_space=0的含义和用途。
答:我们使用sudo sysctl -w kernel.randomize_va_space=0命令类关闭“地址空间随机化”这一功能,表示关掉aslr功能,ASLR(Address space layout randomization)是一种针对缓冲区溢出的安全保护技术,通过对栈、共享库映射等线性区布局的随机化,防止攻击者定位攻击代码位置,达到阻止溢出攻击的目的。
sysctl命令用于运行时配置内核参数,还可以设置或重新设置联网功能。
-w参数用于临时改变某个指定参数的值。格式为「 sysctl [-n] [-e] -w variable=value」
设置全局变量 randomize_va_space 值为 0 (该值默认为1),可以让程序的栈和 mmap 映射区域从一个固定位置开始。
3.描述fprintf、printf、sprintf、snprintf、vprintf这几个函数的功能和差异。
函数声明:
#include <stdio.h>
int printf(const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
int sprintf(char *str, const char *format, ...);
int snprintf(char *str, size_t size, const char *format, ...);
#include <stdarg.h>
int vprintf(const char *format, va_list ap);
参数类型 | 输出到设备 | 输出到文件 | 输出到字符串 |
---|---|---|---|
可变参数 | printf | fprintf | sprint、snprintf |
固定参数 | vprintf |
描述:print系列函数根据format 参数生成输出内容:
printf和vprintf函数把输出内容写到stdout,即标准输出流;
Fprintf:函数把输出内容写到指定的stream流;
sprintf:存入指定的数组buf内,会自动在结尾追加null字节。此外,因为
sprintf可能会溢出,所以调用者要确保buf的尺寸;
snprintf:把输出内容存放到字符串str中,相对于sprintf明确指定了尺寸,防止溢出问题。
这些函数由格式字符串format参数控制输出内容,它指出怎么样把后面的参数(或通过stdarg(3)的变长参数机制访问的 参数)转换成输出内容。
这些函数返回打印的字符数量(不包括字符串结尾用的‘\\0‘)。snprintf的输出不会超过size 字节(包括了结尾的`\\0’), 如果因为这个限制导致输出内容被截断, 则函数返回-1。
以上是关于软件安全实验——pre3的主要内容,如果未能解决你的问题,请参考以下文章
2018-2019-1 20165320 《信息安全系统设计基础》 缓冲区溢出漏洞实验