惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
人人都是产品经理
人人都是产品经理
S
Securelist
P
Proofpoint News Feed
H
Help Net Security
S
Schneier on Security
T
Tenable Blog
C
Cisco Blogs
S
Security @ Cisco Blogs
博客园 - 司徒正美
博客园 - 叶小钗
Cisco Talos Blog
Cisco Talos Blog
Google DeepMind News
Google DeepMind News
C
Cybersecurity and Infrastructure Security Agency CISA
Google Online Security Blog
Google Online Security Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Hacker News: Ask HN
Hacker News: Ask HN
NISL@THU
NISL@THU
云风的 BLOG
云风的 BLOG
V
Vulnerabilities – Threatpost
T
The Blog of Author Tim Ferriss
aimingoo的专栏
aimingoo的专栏
W
WeLiveSecurity
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Jina AI
Jina AI
腾讯CDC
WordPress大学
WordPress大学
Simon Willison's Weblog
Simon Willison's Weblog
Vercel News
Vercel News
小众软件
小众软件
N
Netflix TechBlog - Medium
有赞技术团队
有赞技术团队
AWS News Blog
AWS News Blog
雷峰网
雷峰网
Forbes - Security
Forbes - Security
The Hacker News
The Hacker News
博客园 - 聂微东
F
Full Disclosure
量子位
Scott Helme
Scott Helme
宝玉的分享
宝玉的分享
A
About on SuperTechFans
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Schneier on Security
Schneier on Security
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
K
Kaspersky official blog
AI
AI
SecWiki News
SecWiki News
Webroot Blog
Webroot Blog
Martin Fowler
Martin Fowler

WangDeer

非机动车交通规则测验 微软 50 周年壁纸是在 macOS上设计的? 「转」西二旗折叠:蜂巢经济学启示录 难得空明 Ubuntu Clean ApidocJs apigroup Support Chinese int(10)里面的10是什么意思? 5-3 会话 2021-03-25 「PHP架构师」面试准备 Laravel 上传 Docx 文件,表单验证不通过 4-4 发送信号 4-3 信号集 4-2 编写中断信号处理程序 2022-03-10 面试复盘 4-1 什么是中断信号(软中断) 3-7 进程查看 3-6 SUID特权进程 3-5多进程编写 3-4进程调度 3-3进程exec 3-2进程退出和回收 3-1进程标识与fork 2-2命令行参数与环境参数表 2-1程序与进程 1-1课程介绍 终极复盘 第八章 传承篇 第七章 自由篇 第六章 品牌篇 第五章 作品篇 第四章 定位篇 第三章 金钱篇 第二章 富人篇 第一章 财务自由篇 财富思维觉醒课前作业 This Set Cookie Was Blocked Because It Was Not Sent Over a Secure Connection 「转」Windows11右键恢复至Windows10模式 Ecshop 4.0 微信登录 一直循环授权登录 PHP判断指定日期是否为工作日 PHP Ajax 跨域请求允许多个域名 返回键劫持,强制跳转到指定链接 Chromium Adobe Flash Player下载 批量检查并清除BOM头 Ecshop之smarty与js冲突问题 Ecshop 广告位宽度值必须在1 1024之间 修改方法 PHP获取指定时区当前时间-PHP获取世界时钟 phpcms 更新栏目缓存 `PHP Has Encountered a Stack Overflow` 解决办法 php判断是否手机访问-php判断访问终端类型 丢了 如果昨天是明天的话就好了,这样今天就周五了 Ecshop自定义调用指定广告位 Destoon修改商务便签文字 Ecshop首页获取指定分类的推荐商品 QQ空间如何屏蔽好友刷屏广告 Css实现文字竖排 英尺(inch)、厘米(cm) JS转换 网页禁止鼠标右键 Destoon 选择支付方式 可单独关闭对联广告两枚 网页打开不是在最顶部,而是跳到中间位置解决方法 Ecmall iis 伪静态规则 Destoon 复制商城模块 QQ在线客服设置 QQ开启临时会话教程 Ecshop加入购物车js报错 IE浏览器“浏览器模式”和“文本模式” 网站图片在IE浏览器下不显示 Ecshop 去掉头部版权信息 echsop “transport.js/run() error:'process_request' 未定义”-解决方法 Ecshop Deprecated:Assigning the Return Value of New by Reference Is Deprecated in 报错解决方法 PHPCMS全局循环调用二级类目导航 如何使EditPlus打开tpl文件高亮显示代码 Ecshop前台英文后台中文实现方法 Ecshop安装报错warning:date_default_timezone_get() 1970年1月1日(00:00:00 GMT)Unix时间戳(Unix Timestamp) 黑莓bb微信 2.6 for os5 黑莓微信内测版问题总结及开发建议 360安全卫士卸载过程 管理距离AD值(Administrative Distance) 思科在中国的总代及金牌、银牌代理商 黑莓7100T拆机全程实录 CCNA静态路由配置实例 8700G国产壳白色,太粗糙了 黑莓7100T玉照曝光 黑莓手机电池的正确使用和保养 51啦统计不能打开,求分析,求解释 处女作,黑莓8707G4.2主题出炉 我的2011 Xweibo手机版底部版权修改 常用ping地址,逗逗搜索引擎,SEO必备 飞飞影视系统快播播放列表前缀修改 飞飞影视系统title修改 这才整明白啥叫被跨省,上网有风险,发帖需谨慎 为emlog添加Gravatar头像服务功能 三层交换机实现VLAN间通信 路由器的基本配置 路由器接口类型及连接方式 19岁双IE 谈Cisco认证 Secondary IP-Address 用途 儿童节NA战报 CCNA疑难解析之network x.x.x.x
2-3解释器文件
王二 · 2022-02-18 · via WangDeer

解释器文件

解释器文件,是一种文本文件,例如 PHP 写的解释器文件 demo.php

#!/usr/bin/php
<?php

echo 'Hello World!'

chmod u+x demo.php 赋予可执行权限,即可直接以 ./demo.php 执行。

解释器,是可执行文件 ELF,例如 /usr/bin/php

bash 进程启动过程

bash 进程是如何创建的?

  1. 直接在 centos、ubuntu等终端直接登录,由 login 服务开启 bash 进程。

  2. 通过网络方式登录到 shell 终端,由 sshd 服务开启 bash 进程。

    sshd 服务默认监听 22 端口。

进程观察的几个命令:

  1. pstree 查看 Linux 进程间的关系,显示进程树。

    pstree -ap

        ├─sshd,9408
        │   └─sshd,444836    
        │       └─bash,444875
        │           └─pstree,444893 -ap
    

    ctrl+c 产生一个中断信号,退出当前终端正在执行的进程。

    ctrl+z 把当前台进程丢到后台去暂停。

  2. strace,跟踪系统调用和信号。

    通过 strace -f -s 65500 -p 9408 -o ssh.log 追踪 pid = 9408 的 sshd 进程的系统调用,来分析 bash 进程是如何创建的。

    strace: Process 9408 attached
    strace: Process 447115 attached
    
    ...
    
    strace: Process 447151 attached
    ^Cstrace: Process 9408 detached
    strace: Process 447115 detached
    strace: Process 447143 detached
    

    ssh.log 部分内容:

    9408  select(95, [3], NULL, NULL, NULL) = 1 (in [3])
    9408  accept(3, {sa_family=AF_INET, sin_port=htons(4143), sin_addr=inet_addr("1xx.1x9.xx3.1xx")}, [128->16]) = 4
    // accept 用来接收一个 socket 客户端连接
    
    ...
    
    9408  clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f1fc4482210) = 447115
    // clone = fork 用来创建一个子进程
    
    447115 execve("/usr/sbin/sshd", ["/usr/sbin/sshd", "-D", "-R"], 0x55d325ea09c0 /* 7 vars */) = 0
    // execve 用来执行一个程序
    
    447115 clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD <unfinished ...>
    447143 set_robust_list(0x7fa0e70b0220, 24 <unfinished ...>
    447115 <... clone resumed>, child_tidptr=0x7fa0e70b0210) = 447143
    447143 <... set_robust_list resumed>)   = 0
    // 创建子进程 447143
    
    ...
    
    447143 execve("/bin/bash", ["-bash"], 0x563bf3853680 /* 25 vars */) = 0
    // 执行 bash 程序
    

    a. 通过 accept 接收 ssh 客户端连接;

    b. 通过 clone 创建一个子进程;

    c. 通过 execve 执行 sshd 程序;

    d. 创建一个子进程;

    e. 执行 bash 程序。

解释器文件在 bash 中运行的过程

通过 strace -f -s 65500 -o demo_with_php.log php demo3.php 追踪 php demo3.php 形式的运行过程:

demo_with_php.log 部分内容:

// system call
505   execve("/usr/bin/php", ["php", "demo3.php"], 0x7ffdaed67dc0 /* 53 vars */) = 0

...

// 打开解释器文件
505   openat(AT_FDCWD, "demo3.php", O_RDONLY) = 3

...

// 读取解释器文件
505   read(3, "#!/usr/bin/php\n<?php\n\necho \"Hello World!\";\n", 4096) = 43

// 解释执行
505   close(3)                          = 0
505   write(1, "Hello World!", 12)      = 12
505   close(0)                          = 0

通过 strace -f -s 65500 -o demo.log php demo3.php 追踪 php demo3.php 形式的运行过程:

demo.log 部分内容:

// execve 函数在载入文件的时候,一般是当做 ELF 可执行文件载入,读取 ELF Header。
// 如果不是 ELF 文件,就当做解释器文件读取文件的第一行,得到解释器的完整路径。
596   execve("./demo3.php", ["./demo3.php"], 0x7ffd6a87e5f8 /* 53 vars */) = 0

...

// 打开解释器文件
596   openat(AT_FDCWD, "./demo3.php", O_RDONLY) = 3

...

// 解释执行
596   read(3, "#!/usr/bin/php\n<?php\n\necho \"Hello World!\";\n", 4096) = 43
596   close(3)                          = 0
596   write(1, "Hello World!", 12)      = 12
596   close(0) 

解释器文件在 bash 中运行的过程