crash提供了vm命令来输出进程的vma相关的信息。 输出当前当进程的vma列表 crash> vm PID: 3319 TASK: ffff889760358000 CPU: 6 COMMAND: "kvm" MM PGD RSS TOTAL_VM ffff893ada
#define VM_HUGEPAGE 0x20000000 #define VM_NOHUGEPAGE 0x40000000 #define VM_MERGEABLE 0x80000000 vm_start:虚拟地址区域的起始地址 vm_end:虚拟地址区域的结束地址 vm_next、vm_pre:VMA链表指针 vm_flags:VMA状态标志 vm_page_prot:VMA访问权限,代码段可读可执行蛋不可写,数据段可写可读不可执行 vm_mm:...
caddr_t addr = mmap(NULL, PAGE_SIZE, PROT_WRITE, MAP_SHARED, f, paddr & PAGE_MASK); 内核中实现: static int led_mmap(struct file *f, struct vm_area_struct *vma) { if (remap_pfn_range(vma, vma->start, (EPLD_BASE_ADDR + vma->vm_pgoff) >> PAGE_SHIFT, vma->vm_end – vma...
struct vm_area_struct *vm_next, *vm_prev; pgprot_t vm_page_prot; /* vma的访问权限 */ unsigned long vm_flags; /* 标识集 */ struct rb_node vm_rb; /* 红黑树中对应的节点 */ /* * For areas with an address space and backing store, * linkage into the address_space->i_mmap prio...
vm_mm就是此vma所属的mm_struct结构 vm_page_prot意思是此vma所对应的权限,是否可读可写可执行等 我们还是借用这张图,可以看到task_struct中的mm_struct中会存在mmap和mmap_rb成员。 代码语言:javascript 代码运行次数:0 运行 AI代码解释 struct mm_struct{struct{struct vm_area_struct*mmap;/* list of VMAs...
unsigned long vm_start; /* vma的起始地址 */ unsigned long vm_end; /* vma的结束地址 */ /* 该vma的在一个进程的vma链表中的前驱vma和后驱vma指针,链表中的vma都是按地址来排序的*/ struct vm_area_struct *vm_next, *vm_prev; pgprot_t vm_page_prot; /* vma的访问权限 */ ...
vm_area_struct->vm_flags为vma线性区层面的属性,属于软件层面,它将最终转换处理器页表项层面的标志,通过vm_get_page_prot可以完成这个转换,转换之后的页表项层面的标志一般保存到vm_area_struct->vm_page_prot 对于vma的权限属性与页表项的转换如下图: ...
staticint __bprm_mm_init(struct linux_binprm *bprm){bprm->vma = vma = vm_area_alloc(mm);vma->vm_end = STACK_TOP_MAX;vma->vm_start = vma->vm_end - PAGE_SIZE;bprm->p = vma->vm_end - sizeof(void *);} 接下来使用load_elf_binary加载可执行二进制程序,把准备的进程栈地址空间指针...
{__rb_parent_color = 0xffff88dcc831ea18,rb_right = 0x0,rb_left = 0x0},rb_subtree_gap = 0x0,vm_mm = 0xffff88dea7232000,vm_page_prot = {pgprot = 0x25},vm_flags = 0x8040075,shared = {rb = {__rb_parent_color = 0x0,rb_right = 0x0,rb_left = 0x0},rb_subtree_last =...
利用我们之前通过dmesg泄漏的地址,最终我们需要伪造一个vma结构,其中的几个关键点是:vm_start和vm_end,vm_start必须设置0x7fffffffd000或者是随便一块没有被映射的区域,这样我们在解应用这块区域去触发页错误的时候,我们会找到我们伪造的vma。 第二个关键点是vm_ops,我们将会在子进程中调用eventfd来阻塞,直到我们在...