软件安全实验——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);
参数类型输出到设备输出到文件输出到字符串
可变参数printffprintfsprint、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。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值