首页 > 系统相关 >禁用Linux的地址空间随机化

禁用Linux的地址空间随机化

时间:2024-10-28 23:45:08浏览次数:8  
标签:__ addr int 禁用 double 随机化 common Linux include

问题描述

当我们学习OS的时候,往往需要接触到虚拟地址分配的相关知识。当接触到《Operating Systems: Three Easy Pieces》(Operating Systems: Three Easy Pieces

中的示例程序mem.c时(文末附上common.h)

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include "common.h"

int main(int argc, char *argv[]) {
    if (argc != 2) { 
	fprintf(stderr, "usage: mem <value>\n"); 
	exit(1); 
    } 
    int *p; 
    p = malloc(sizeof(int));
    assert(p != NULL);
    printf("(%d) addr pointed to by p: %p\n", (int) getpid(), p);
    *p = atoi(argv[1]); // assign value to addr stored in p
    while (1) {
	Spin(1);
	*p = *p + 1;
	printf("(%d) value of p: %d\n", getpid(), *p);
    }
    return 0;
}

当输入执行

./mem 1 & ./mem 2 &

时,却发现和书中的“两者在相同的地址分配内存的说法不同”。显示出

 (6832) addr pointed to by p: 0x55796cae82a0   

 (6833) addr pointed to by p: 0x55ad109c42a0      

 最终查阅资料发现,这是因为现在在 Linux 系统中,地址空间随机化(ASLR,Address Space Layout Randomization)是一种安全特性,它通过随机化进程地址空间中的关键区域(如堆、栈和共享库)的位置来增加对缓冲区溢出攻击的抵抗力。然而,在当前情况下,我们需要禁用 ASLR来减少我们学习的痛苦。。。

问题解决

禁用ASLR(仅仅建议在非生产环境中):

sudo sysctl -w kernel.randomize_va_space=0

重启ASLR                       

sudo sysctl -w kernel.randomize_va_space=1

         

最后

附上common.h

#ifndef __common_h__
#define __common_h__

#include <sys/time.h>
#include <sys/stat.h>
#include <assert.h>

double GetTime() {
    struct timeval t;
    int rc = gettimeofday(&t, NULL);
    assert(rc == 0);
    return (double) t.tv_sec + (double) t.tv_usec/1e6;
}

void Spin(int howlong) {
    double t = GetTime();
    while ((GetTime() - t) < (double) howlong)
	; // do nothing in loop
}

#endif // __common_h__

Tips:

新手一枚,如果觉得有疑问可以私信询问!

如果上述文章内容有讲得不正确或者不清楚的地方,欢迎留言评论区或者私信!

最后,能给我一个小小的赞或者关注吗

标签:__,addr,int,禁用,double,随机化,common,Linux,include
From: https://blog.csdn.net/2301_79273066/article/details/143316438

相关文章

  • Escalate_Linux靶机提权学习
    靶机下载https://www.vulnhub.com/entry/escalate_linux-1,323/用VMware打开扫描端口nmap-sS-sV-n-T4-p-192.168.93.134StartingNmap7.94SVN(https://nmap.org)at2024-10-0409:26CSTNmapscanreportfor192.168.93.134Hostisup(0.00090slatency).Not......
  • 【Linux学习】(8)第一个Linux编程进度条程序|git三板斧
    前言第一个Linux编程——进度条git的简单使用一、第一个Linux编程——进度条在写进度条之前我们需要两个基础知识:回车换行缓冲区1.回车换行首先我们需要知道回车换行它是两个概念,回车是回车,换行是换行换行:光标从上往下,直接到下一行(例如光标现在在当前行的第5个......
  • 【Linux探索学习】第五弹——Linux用户管理:创建、删除与查看普通用户
    前言:Linux下创建普通用户是我们以后经常要做的一件事,一个超级用户下可以有多个普通用户,这样我们就可以用这些普通用户去做不同的事情,所以学习如何创建并管理这些用户就显得尤为重要提醒:本篇是在Ubuntu系统下进行的操作目录一、创建普通用户二、测试是否创建成功方法一:方法二:三、查......
  • Linux网络连接三种模式的区别(图解超详细)
    (CentOS安装难点——网络连接方式的理解)参考视频链接为什么选择NAT模式?如上图情景设定:图中三个人在同一个教室网络,可以相互通讯,因为他们三人在同一网段(三者都以192.168.0打头)。1.桥接模式虚拟系统可以和外部系统相互通讯,但是容易造成ip冲突(张三ip:192.168.0.20,他......
  • Linux基础命令:轻松掌握终端操作
    引言在现代IT行业中,Linux因其稳定性和灵活性广受欢迎。作为后端开发、系统管理和数据科学等领域的必备技能,熟练掌握Linux基本命令将使你在职场中更加游刃有余。无论你是刚接触Linux的新手,还是希望提升技能的开发者,了解Linux命令行的基本用法都是至关重要的。今天,我们将探讨一......
  • 网络编程 Linux环境 C语言实现
    进程间通信的延续跨电脑进程间通信一、远程通信方式电路交换------老式有线电话通信​报文交换​分组交换支持分时机制的(分片机制)报文交换​现行网络大部分都是采用分组交换形式二、网络&互联网&因特网网络Network:多台计算机通过某种传输介质连接在一起形成......
  • linux shell特殊参数
    $n功能描述:n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数需要使用大括号包含,如${10}$*功能描述:这个变量代表命令行中的所有参数,此命令把所有参数看成一个整体$@功能描述:这个变量也代表命令行中的所有的参数,但是此命令把每个参数区分对待注意:$*与$@区别在于......
  • 黑客入门Linux安装准备工作
    ArsenalLinux黑客新手入门推荐:社区采用二个系统进行更新后续文章,分别如下:-Kalilinux:内包含大量工具/一次下载安装可以减少所需要工具安装时间。退求其次:Kali是目前最火爆的黑客工具集成系统。最关键的是网上教程很多,方便更多爱好者实战自己的才能。Linuxmint:目前......
  • 黑客新手入门应该懂的Linux 细节知识
    Linux到底是什么?Linux是_*一个_*家族开源的类Unix操作系统基于Linux内核l.Linux是LinusTorvalds的创意。显然.他制作Linux是为了好玩,并于1991年9月17日发布了Linux的第一个版本。据传Linux的创造者打算将他的发明命名为Freax,但未经LinusTorvalds......
  • Linux系统中的信号
    目录一、信号的概念二、信号处理1.信号处理的三种方式(1)默认处理(2)忽略处理 (3)自定义处理(信号捕捉)2.信号处理的时机 3.自定义捕捉的另一个函数sigaction4.sigaction函数中的sa_mask三、信号产生的方式1.使用kill命令,向指定进程发送信号2.使用键盘3.系统调用......