- 主题:小白一问:随意指定地址的指针的行为
以前的书本里讲指针,会一本正经地举例
int *p = (int*)0x12345678;
煞有介事地说,解引用便可获得随意地址上的内存信息。
但操作系统根本不给面子,直接 segmentation fault。
猜测这里面的原因很简单,不同进程的内存空间不能直接读写。
可为什么这样的例子会存在这么多年,
是操作系统后来改了内存机制?
--
修改:easior FROM 61.155.142.*
FROM 61.155.142.*
可惜没这方面的经验,
也不知道怎么进入内核模式编程,
就知道一些系统调用。
系统调用可能有这样的能力,
但没有那样的指针写法。
【 在 yytree (yytree) 的大作中提到: 】
: If you write kernel mode driver or embedded system program, you can surely do like this.
--
FROM 61.155.142.*
为了这个指针写法,没必要去学怎么写驱动吧
既然这是底层的东西,那就略过
【 在 leslin (我心有约) 的大作中提到: 】
: 那还是先不要关心这些功能了吧
: 先把计算机基础学好了再看
--
FROM 61.155.142.*
这个我倒是有印象,好多年前的事情了
现在该用啥作弊技术了
【 在 officercat (黑猫警长·奈叶要加油) 的大作中提到: 】
: 玩过以前PC游戏的金手指么? 比如金山游侠修改器,就是能直接访问全局内存地址取跟踪其他进程的内存使用情况。应该是比较经典的技术
--
修改:easior FROM 61.155.142.*
FROM 61.155.142.*
估计知识是从Dos时代沿袭过来的,
只不过现代操作系统都有内存保护模式了
【 在 tangyl (-v-) 的大作中提到: 】
: 这是DOS时代的书吗?
--
FROM 61.155.142.*
你说的这些我都了解,只不过那样的指针现在行不通了
【 在 ArchLinux (a lightweight and flexible distribution) 的大作中提到: 】
: 你需要了解现代通用处理器有虚拟存储系统,有一个成为内存管理单元(MMU)的部件处理内存访问。处理器执行一个内存访问指令的时候,MMU会把要访问的地址转为物理地址,这个机制使得操作系统可以让不同的进程可以访问不同的物理内存,而不同应用程序可以使用同样的虚拟地址
--
FROM 61.155.142.*
对于判断内存是否被映射,以及是否有 RWX的权限,很有兴趣
能否介绍一下哪些系统调用是用来判定这些的?
【 在 z16166 (Netguy) 的大作中提到: 】
: DOS时代直接写显存就能更改屏幕上的内容。
: 当然显存的地址是固定的一个值,而不是你搞的这个12345678。
: 在地址随机化出来之前,有些shellcode也是硬编码某些地址的。
: 是否会seg fault,取决于你的这个地址对应的内存是否映射了,以及这个内存位置的RWX权限。
--
FROM 61.155.142.*
这当然是好事,增加了黑客的难度。
之所以这么问,就是想知道那样指针什么场合下存在?
【 在 here080 (hero080) 的大作中提到: 】
: 内存有保护,随意解引用会seg fault是好事。
: 如果不seg fault,你的程序甚至操作系统都会出现你无法预料的行为,比如把你银行的钱花光。
--
FROM 61.155.142.*
1. 只要对其操作,除去取地址之外,都会 segmentation fault
2. 既然有平台可以这么操作,确实应该写;最好也要提一下现代操作系统的工作方式
【 在 dpblue (deep blue) 的大作中提到: 】
: 1. 不一定会segment fault
: 2. 不这么说的书本都是耍流氓
--
修改:easior FROM 27.115.42.*
FROM 61.155.142.*