深入理解系统调用_第1页
深入理解系统调用_第2页
深入理解系统调用_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、深入理解系统调用找一个系统调用,系统调用号为学号最后2位相同的系统调用:本次实验选择84号系统调用:rmdir。该系统调用的作用是删除文件夹。#includeintrmdir(constchar*pathname);返回值:若成功则返回0,若出错则返回-1通过汇编指令触发该系统调用:首先使用c库函数触发rmdir系统调用:#include#includeintmain()intflag;char*dir=test;flag=rmdir(dir);if(flag=0)printf(“删除成功门“);elseprintf(删除失败门“);return0;通过反汇编发现通过%rdi传递参数,通过ea

2、x传递系统调用号:下面使用嵌入式汇编来代替libc提供的rmdir()函数,并触发rmdir系统调用:#include#includeintmain()intflag;char*dir=test;asmvolatile(movq%1,%rdintmovq$0 x54,%raxntsyscallntmovq%rax,%0nt:=m(flag):b(dir);if(flag=0)printf(Deletesucceededn);elseprintf(Deleteunsucceededn);return0;通过实验验证了改写成功,能够通过嵌入式汇编触发rmdir系统调用:通过gdb跟踪该系统调用的内

3、核处理过程:通过bt查看函数调用栈,结合课上所学知识和本次实验,绘制了两幅系统调用的宏观图:64位嵌入式汇编:32位libc提供的rmdir()函数:由于gdb无法追踪entry_SYSCALL_64处的汇编代码,因此我们只能把断点设在do_syscall_64()和_x64_sys_rmdir()函数处,通过以下调试代码可以看到:首先gdb跟踪到了do_syscall_64(nr=84,regs=0 xffffc90000033f58处,然后进入函数体内,在执行到regs-ax=sys_call_tablenr(regs)时,根据系统调用号和参数跳转到_x64_sys_rmdir()函数处,

4、执行完对应的内核处理函数后,依次返回到do_syscall_64函数中执行syscall_return_slowpath(regs),再返回到entry_SYSCALL_64中,在这段汇编的末尾,我们跟踪到了USERGS_SYSRET64这条语句,它相当于做了swapgs和sysretq,对应恢复现场和中断返回,接着继续执行用户态的代码。Breakpoint1,do_syscall_64(nr=84,regs=0 xffffc90000033f58)atarch/x86/entry/common.c:279279(gdb)lprepare_exit_to_usermode(regs);276#

5、ifdefCONFIG_X86_64_visiblevoiddo_syscall_64(unsignedlongnr,structpt_regs*regs)structthread_info*ti;281enter_from_user_mode();local_irq_enable();(gdb)nlocal_irq_enable();(gdb)nti=current_thread_info();(gdb)nif(READ_ONCE(ti-flags)&_TIF_WORK_SYSCALL_ENTRY)(gdb)nif(likely(nrax=sys_call_tablenr(regs);(gd

6、b)nBreakpoint2,_x64_sys_rmdir(regs=0 xffffc90000033f58)atfs/namei.c:39513951SYSCALL_DEFINE1(rmdir,constchar_user*,pathname)(gdb)ndo_rmdir(dfd=-100,pathname=0 x492164test)atfs/namei.c:38933893(gdb)n3900unsignedintlookup_flags=0;(gdb)n3893(gdb)n3902name=filename_parentat(dfd,getname(pathname),lookup_f

7、lags,(gdb)n3904if(IS_ERR(name)(gdb)n3902name=filename_parentat(dfd,getname(pathname),lookup_flags,(gdb)n3904if(IS_ERR(name)(gdb)n3907switch(type)(gdb)nerror=mnt_want_write(path.mnt);(gdb)nif(error)(gdb)ninode_lock_nested(path.dentry-d_inode,I_MUTEX_PARENT);(gdb)ndentry=_lookup_hash(&last,path.dentry

8、,lookup_flags);(gdb)n3926if(IS_ERR(dentry)(gdb)n3924dentry=_lookup_hash(&last,path.dentry,lookup_flags);(gdb)n3926if(IS_ERR(dentry)(gdb)n3928if(!dentry-d_inode)(gdb)n3935error=vfs_rmdir(path.dentry-d_inode,dentry);(gdb)n3937dput(dentry);(gdb)ninode_unlock(path.dentry-d_inode);(gdb)nmnt_drop_write(pa

9、th.mnt);(gdb)npath_put(&path);(gdb)n3945lookup_flags|=LOOKUP_REVAL;(gdb)npath_put(&path);(gdb)nputname(name);(gdb)nif(retry_estale(error,lookup_flags)(gdb)n3949(gdb)ndo_syscall_64(nr=180688,regs=0 xffffc90000033f58)atarch/x86/entry/common.c:300300syscall_return_slowpath(regs);(gdb)n301(gdb)nentry_SY

10、SCALL_64()atarch/x86/entry/entry_64.S:184184movqRCX(%rsp),%rcx(gdb)n185movqRIP(%rsp),%r11(gdb)n187cmpq%rcx,%r11/*SYSRETrequiresRCX=RIP*/(gdb)n188jneswapgs_restore_regs_and_return_to_usermode(gdb)n205shl$(64-(_VIRTUAL_MASK_SHIFT+1),%rcx(gdb)n206sar$(64-(_VIRTUAL_MASK_SHIFT+1),%rcx(gdb)n210cmpq%rcx,%r

11、11(gdb)n211jneswapgs_restore_regs_and_return_to_usermode(gdb)n213cmpq$_USER_CS,CS(%rsp)/*CSmustmatchSYSRET*/(gdb)n214jneswapgs_restore_regs_and_return_to_usermode(gdb)nmovqR11(%rsp),%r11(gdb)ncmpq%r11,EFLAGS(%rsp)/*R11=RFLAGS*/(gdb)njneswapgs_restore_regs_and_return_to_usermode(gdb)n238testq$(X86_EF

12、LAGS_RF|X86_EFLAGS_TF),%r11(gdb)n239jnzswapgs_restore_regs_and_return_to_usermode(gdb)n243cmpq$_USER_DS,SS(%rsp)/*SSmustmatchSYSRET*/(gdb)n244jneswapgs_restore_regs_and_return_to_usermode(gdb)n253POP_REGSpop_rdi=0skip_r11rcx=1(gdb)nentry_SYSCALL_64()atarch/x86/entry/entry_64.S:259259movq%rsp,%rdi(gd

13、b)n260movqPER_CPU_VAR(cpu_tss_rw+TSS_sp0),%rsp(gdb)nentry_SYSCALL_64()atarch/x86/entry/entry_64.S:262262pushqRSP-RDI(%rdi)/*RSP*/(gdb)nentry_SYSCALL_64()atarch/x86/entry/entry_64.S:263263pushq(%rdi)/*RDI*/(gdb)nentry_SYSCALL_64()atarch/x86/entry/entry_64.S:271271SWITCH_TO_USER_CR3_STACKscratch_reg=%rdi(gdb)npopq%rdi(gdb)nentry_SYSCALL_64()atarch/x86/entry/entry_64.S:274popq%rsp(gdb)nentry_SYSCALL_64()atarch/x86/entry/entry_64.S:275USERGS_SYSRET64(gdb)n0 x0000000

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论