ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

pwn学习日记Day21 《程序员的自我修养》读书笔记

2019-05-27 18:42:45  阅读:306  来源: 互联网

标签:文件 调用 程序 读书笔记 Day21 ELF 进程 pwn execve


Linux内核装载ELF过程

(1)bash进程调用fork()系统调用创建一个新的进程
(2)新的进程调用execve()系统调用执行指定的ELF文件,原先的bash进程继续返回等待刚才启动的新进程结束,然后继续等待用户输入命令。
(3)execve()系统调用相应的入口是sys_execve(),sys_execve()进行一些参数的检查复制后,调用do_execve()。
(4)do_execve()读取128个字节的文件头部,调用search_binary_handle()。
(5)search_binary_handle()通过魔数确定文件格式,并调用相应的装载过程:
1.检查ELF可执行文件格式的有效性,比如说魔数、程序头中段的数量。
2.寻找动态链接“interp.”段,设置动态链接器路径。
3.根据ELF可执行文件的程序头表的描述,对ELF文件进行映射,比如代码、数据、只读数据。
4.初始化ELF进程环境,比如进程启动时EDX寄存器的地址应该是DT_FINI的地址。
5.将系统调用的返回地址修改成ELF可执行文件的入口点,这个入口点取决于程序的链接方式,对于静态链接的ELF可执行文件,这个程序入口就是ELF文件的文件头中e_entry所指的地址;对于动态链接的ELF可执行问文件,程序的入口点是动态链接器。
(6)上诉步骤执行完,返回do_execve再返回至sys_execve()时,系统调用的返回地址改成了被装载的ELF程序的入口地址了,所以当sys_execve()系统调用从内核态返回到用户态时,EIP寄存器直接跳转到了ELF程序的入口地址,于是新的程序开始执行,ELF可执行文件装载完成。

可执行文件的装载与进程章总结

这一章中,探讨了程序运行时如何使用内存空间的问题,即进程虚拟地址空间问题。接着围绕程序如何被操作系统装载到内存中进行运行,介绍了覆盖装入和页映射的模式,分析以页映射的方式将程序映射至进程地址空间的好处,并从操作系统的角度观察进程如何被建立,当程序运行时发生页错误该如何处理等。
还详细介绍了虚拟地址空间分布,操作系统如何为程序的代码、数据、堆、栈在进程地址空间中分配,它们是如何分布的。最后两个章节分别深入介绍了Linux和Windows程序如何装载并运行ELF个PE程序。这章中,我们假设程序都是静态链接的,那么它们都只有一个单独的可执行文件模块。

地址无关代码总结

  • 模块内部指令跳转、调用:相对跳转和调用
  • 模块内部数据访问:相对地址访问
  • 模块外部指令跳转、调用:间接跳转和调用(GOT)
  • 模块外部数据访问:间接访问(GOT)

知识杂项:

  • bash进程:就是shell的进程,每一个已登录的用户都有bash这个进程,当一个用户在终端上面登录后,Linux系统就会给这个用户一个shell,这个shell就是bash进程(当默认shell程序是bash时),然后你接下来执行的命令都是这个bash进程的子进程,因为它是大部分命令行启动的程序的父进程,所以不要随便终结它。
  • fork()函数:一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。
  • execve()函数:execve(执行文件)在父进程中fork一个子进程,在子进程中调用exec函数启动新的程序。exec函数一共有六个,其中execve为内核级系统调用,其他(execl,execle,execlp,execv,execvp)都是调用execve的库函数。
  • DLL(Dynamic Link Library)文件:为动态链接库文件,又称“应用程序拓展”,是软件文件类型。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可使用多个DLL文件,一个DLL文件也可能被不同的应用程序使用,这样的DLL文件被称为共享DLL文件。

参考

《程序员的自我修养》

标签:文件,调用,程序,读书笔记,Day21,ELF,进程,pwn,execve
来源: https://www.cnblogs.com/luoleqi/p/10932320.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有