复习
init
程序,随后变为 “异常处理程序”init
: fork, execve, exit 和其他系统调用创造整个操作系统世界本次课回答的问题
本次课主要内容
char *p
可以和 intptr_t
互相转换
main
, %rip
会从此处取出待执行的指令),只读static int x
),读写int y
),读写NULL
,导致 segmentation fault它们停留在概念中,但实际呢?
pmap (1) - report memory of a process
/proc/
) 实现的查看进程的地址空间
RTFM: /proc/[pid]/maps
(man 5 proc)
-l
) 里的信息互相验证address perms offset dev inode pathname
00400000-00401000 r--p 00000000 fd:00 525733 a.out
00401000-00495000 r-xp 00001000 fd:00 525733 a.out
00495000-004bc000 r--p 00095000 fd:00 525733 a.out
004bd000-004c3000 rw-p 000bc000 fd:00 525733 a.out
004c3000-004c4000 rw-p 00000000 00:00 0 [heap]
0000555555554000 r--p a.out
0000555555555000 r-xp a.out
0000555555556000 r--p a.out
0000555555557000 r--p a.out
0000555555558000 rw-p a.out
00007ffff7dc1000 r--p libc-2.31.so
00007ffff7de3000 r-xp libc-2.31.so
00007ffff7f5b000 r--p libc-2.31.so
00007ffff7fa9000 r--p libc-2.31.so
00007ffff7fad000 rw-p libc-2.31.so
00007ffff7faf000 rw-p (这是什么?)
00007ffff7fcb000 r--p [vvar] (这又是什么?)
00007ffff7fce000 r-xp [vdso] (这叒是什么?)
00007ffff7fcf000 r--p (省略相似的 ld-2.31.so)
00007ffffffde000 rw-p [stack]
ffffffffff600000 --xp [vsyscall] (这叕是什么?)
“执行系统调用时,进程陷入内核态执行”——不,不是的。
系统调用就是一组接口的约定,谁说一定要 int
指令?
SYSCALL — Fast System Call
RCX <- RIP; (* 下条指令执行的地址 *)
RIP <- IA32_LSTAR;
R11 <- RFLAGS;
RFLAGS <- RFLAGS & ~(IA32_FMASK);
CPL <- 0; (* 进入 Ring 0 执行 *)
CS.Selector <- IA32_STAR[47:32] & 0xFFFC
SS.Selector <- IA32_STAR[47:32] + 8;
能不能让其他系统调用也 trap 进入内核?
使用共享内存和内核通信!
进程只有少量内存映射
地址空间里剩下的部分是怎么创建的?
进程的地址空间 = 内存里若干连续的 “段”
管理进程地址空间的系统调用
// 映射
void *mmap(void *addr, size_t length, int prot, int flags,
int fd, off_t offset);
int munmap(void *addr, size_t length);
// 修改映射权限
int mprotect(void *addr, size_t length, int prot);
它们的确好像没有什么区别
Example 1:
Example 2:
但我们好像带来了一些问题……
请查阅手册,看看操作系统是如何规定这些操作的行为的
msync (2)
每个 *ptr
都只能访问
任何一个程序都不能因为 bug 或恶意行为侵犯其他程序执行
电子竞技的先行者:“即时战略游戏” (Real-Time Strategy)
只要有访问其他进程内存和在程序上 “悬浮显示” 的 API 即可
本质是 “欺骗” 进程的时钟
gettimeofday
我们可以改内存,也可以改代码!
The Light Side
The Dark Side
render(objects)
→ render_hacked(objects)
控制/数据流完整性
ReadProcessMemory
和 WriteProcessMemory
,发现后立即拒绝执行其他解决方法
本次课回答的问题
Take-away messages