笔记部分

2019/11/4 17:55:22


  • elf文件代码默认加载到0x8048000,然后是一段首部信息,然后到达程序的真实入口

  • 正常的系统调用会先进入内核态->用户态->系统调用下一条指令,execve执行时先进入内核态,然后在内核里面覆盖掉当前进程,返回时变成新的可执行程序,ef有三种目标文件,可重定位文件,主要是.o文件,可执行文件,主要是.so文件,共享目标文件:链接文件。目标文件格式:创建链接,创建程序,链接程序,运行程序。

动态链接的过程中,动态链接库的依赖关系会形成一个图,其中elf_interperter会检查加载了哪些库,会依赖动态连接器来解析elf文件,加载动态连接器ld,返回用户态时,返回动态连接器的程序入口,动态链接器解析当前可执行文件,检查并加载相关动态链接库,在解析动态链接库,看看其需要哪些文件,一般是一个广度遍历,装载后,ld把cpu控制权在移交给可执行程序;静态时直接执行可执行程序入口,shell创建子进程时复制的是父进程,然后覆盖原来的进程,用户态堆栈也被清空,在创建新的用户态堆栈时,把命令行参数内容和环境参数内容通过指针传递到系统调用的内核处理函数,然后该函数创建可执行程序新的用户态堆栈时,会把这些参数拷贝进去,所以新的函数可以从main函数开始执行,但是,原来的调用execve的命令行压在了shell程序当前的堆栈上,但是这个堆栈在加载完新的可执行文件时,被清空了,然后内核又创建一个新的用户态堆栈

实验部分

2019/11/4 21:03:55


  • 删除并克隆menu,然后进行test.c的覆盖。

  • 并查看test.c

  • 查看Makefile发现静态编译了了hello.c,并把init和hello都放在了rootfs.img里面了

  • 这样执行exec的时候,会自动的加载hello。

  • 进行make rootfs,查看命令并执行exec命令,加载符号表并连接接口,设置断点并执行

  • 接下来执行exec命令,停在了SyS_execve()

  • 追踪这一部分代码

  • 进入到它的内部

  • 单步执行一次并进入两次内部在执行会停在load_elf_binary

  • 继续执行,停在start_thread上

  • 查看new_ip指向哪里,指令:po new_ip,其返回的是用户态第一条指令的地址。

  • 再一次水平分割,并利用命令:readelf -h hello查看这个可执行文件的入口点地址。发现其和new_ip位置一致。

  • 继续进入内部并执行完。

最新文章

  1. Git tag push 到远端仓库
  2. VPS/服务器优化网络、加速方法总结与参考
  3. KVO的底层实现
  4. JNI笔记之 初体验
  5. day8-多进程和多线程
  6. matlab练习程序(构造简单多边形)
  7. 单点登录系统构建之二——SSO原理及CAS架构
  8. 【Oracle】windows默认共享的打开和关闭?
  9. C++ crash 堆栈信息获取(三篇文章)
  10. C#在outlook里创建一封邮件到草稿箱
  11. 安装ruby及sass
  12. Windows平台安装配置mysql数据库
  13. 【Gym - 101164I】Cubes(dfs,剪枝)
  14. Ubuntu 查看CPU温度
  15. mnist手写数字识别(SVM)
  16. 资深投资人全力反击: VC增值平台从来就不是一坨狗屎
  17. js的浮点(小数)数+-*/
  18. bash: hadoop:command not found
  19. java 标识符
  20. Hibernate关联映射之_多对一

热门文章

  1. 【Ubuntu】常用命令汇总,整理ing
  2. 【杂谈】SpringBoot为啥不用配置启动类
  3. 阿里 IOS 面试官教你在面试中脱颖而出
  4. 根据银行卡号 获取银行名称及银行logo
  5. P1627 [CQOI2009]中位数 题解
  6. C#通用类库整理--日志记录
  7. git 从另一个分支融合部分文件
  8. 个推IGt.BaseTemplate.php,不仅有bug,还有bom头,好恶心!
  9. 使用Homebrew在Mountain Lion上安装MySQL
  10. 这个案例写出来,还怕跟面试官扯不明白 OAuth2 登录流程?