jjzjj

linux - ptrace 能否判断 x86 系统调用使用的是 64 位还是 32 位 ABI?

coder 2023-06-21 原文

我正在尝试使用 ptrace 来跟踪由单独进程进行的所有系统调用,无论是 32 位 (IA-32) 还是 64 位 (x86-64)。我的跟踪器将在启用 IA-32 仿真的 64 位 x86 安装上运行,但理想情况下能够跟踪 64 位和 32 位应用程序,包括 64 位应用程序是否 fork 并执行 32 位进程.

问题是,由于 32 位和 64 位系统调用编号不同,我需要知道进程是 32 位还是 64 位以确定它使用了哪个系统调用,即使我有系统调用编号。好像有imperfect methods , 比如检查 /proc/<pid>/exec或者(像 strace 那样)寄存器结构的大小,但没有什么可靠的。

使问题复杂化的是 64 位进程可以 switch out of long mode直接执行32位代码。他们还可以 make 32-bit int $0x80 syscalls ,当然,它使用 32 位系统调用编号。我不“相信”我追踪的进程没有使用这些技巧,所以我想正确地检测它们。我已经独立验证,至少在后一种情况下,ptrace 看到的是 32 位系统调用编号和参数寄存器分配,而不是 64 位。

我在内核源代码中四处寻找并发现了 TS_COMPAT arch/x86/include/asm/processor.h 中标记,这似乎是 set每当 64 位进程进行 32 位系统调用时。唯一的问题是我不知道如何从用户区访问这个标志,或者是否可能。

我也考虑过阅读 %cs并将其与 $0x23 进行比较或 $0x33 , 灵感来自 this method用于在运行过程中切换位数。但这只检测 32 位进程,不一定是来自 64 位进程的 32 位系统调用(使用 int $0x80 生成的)。它也很脆弱,因为它依赖于未记录的内核行为。

最后,我注意到 x86 架构在扩展功能启用寄存器 MSR 中有一个用于长模式的位。但是 ptrace 无法从被跟踪者读取 MSR,我觉得从我的跟踪器中读取它是不够的,因为我的跟踪器总是在长模式下运行。

我很迷茫。也许我可以尝试使用其中一种技巧——目前我倾向于 %cs/proc/<pid>/exec方法——但我想要一些能够真正区分 32 位和 64 位系统调用的持久性方法。 在 x86-64 下使用 ptrace 的进程如何检测到它的 tracee 进行了系统调用,如何可靠地确定该系统调用是使用 32 位( int $0x80 )还是 64 位( syscall )进行的ABI?用户进程是否可以通过其他方式获取有关它被授权进行 ptrace 的另一个进程的信息?

最佳答案

有趣的是,我没有意识到 strace 没有明显更聪明的方法可以用来从 64 位进程正确解码 int 0x80。 (这正在进行中,请参阅 this answer 以获得建议的内核补丁的链接,以将 PTRACE_GET_SYSCALL_INFO 添加到 ptrace API。strace 4.26 已经在打补丁的内核上支持它。)

更新:现在支持每个系统调用检测 IDK 主线内核版本添加了该功能。我在 Arch Linux 上使用内核版本 5.5 和 strace 版本 5.5 进行了测试。

例如这个 NASM 源代码组装成静态可执行文件:

mov eax, 4
int 0x80
mov eax, 60
syscall

给出此跟踪:nasm -felf64 foo.asm && ld foo.o && strace ./a.out

execve("./foo", ["./foo"], 0x7ffcdc233180 /* 51 vars */) = 0
strace: [ Process PID=1262249 runs in 32 bit mode. ]
write(0, NULL, 0)                       = 0
strace: [ Process PID=1262249 runs in 64 bit mode. ]
exit(0)                                 = ?
+++ exited with 0 +++
每次系统调用使用与以前不同的 ABI 位数时,

strace 都会打印一条消息。请注意,关于 runs in 32 bit mode 的消息是完全错误的;它只是使用 64 位模式下的 32 位 ABI。 “模式”有 a specific technical meaning for x86-64 , 这不是它。


使用旧内核

作为解决方法,我认为您可以在 RIP 处反汇编代码并检查它是否是 syscall 指令 ( 0F 05 ),因为 ptrace 确实让你读取了目标进程的内存。

但对于像 disallowing some system calls 这样的安全用例,这将容易受到竞争条件的影响:系统调用进程中的另一个线程可以将 syscall 字节重写为 int 0x80 在它们执行之后,但在您可以查看它们之前跟踪


只有在进程以 64 位模式运行时才需要这样做,否则只有 32 位 ABI 可用。如果不是,则无需检查。 (vdso 页面可能会在支持它但不支持 sysenter 的 AMD CPU 上使用 32 位模式 syscall。首先不检查 32 位进程避免了这个角落案例。)我认为你是说你至少有一种可靠的方法来检测那个

(我没有直接使用 ptrace API,只是像 strace 这样的工具使用它。所以我希望这个答案是有意义的。)

关于linux - ptrace 能否判断 x86 系统调用使用的是 64 位还是 32 位 ABI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53456266/

有关linux - ptrace 能否判断 x86 系统调用使用的是 64 位还是 32 位 ABI?的更多相关文章

  1. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

  2. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  3. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  4. 报告回顾丨模型进化狂飙,DetectGPT能否识别最新模型生成结果? - 2

    导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri

  5. STM32读取串口传感器数据(颗粒物传感器,主动上传) - 2

    文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,

  6. ruby-on-rails - Rails 基本 Base64 身份验证 - 2

    我正在尝试复制此GETcurl请求:curl-D--XGET-H"Authorization:BasicdGVzdEB0YXByZXNlYXJjaC5jb206NGMzMTg2Mjg4YWUyM2ZkOTY2MWNiNWRmY2NlMTkzMGU="-H"Content-Type:application/json"http://staging.example.com/api/v1/campaigns在Ruby中,通过电子邮件+apikey生成身份验证:auth="Basic"+Base64::encode64("test@example.com:4c3186288ae23fd9661c

  7. ruby-on-rails - 在 rails 中显示 base64 编码的图像 - 2

    我正在向我的Controller发送一个base64图像并按原样保存它。现在我需要显示该图像。这是我要显示的内容,但未显示图像:"/>为了编码,我使用了这个java脚本函数encodeURIComponent();我的编码图像格式:data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/........ 最佳答案 你不需要解码base64应该可以 关于ruby-on-rails-在rails中显示base64编码的图像,我们在StackOve

  8. ruby-on-rails -/usr/local/lib/libz.1.dylib,文件是为 i386 构建的,它不是被链接的体系结构 (x86_64) - 2

    在我的mac上安装几个东西时遇到这个问题,我认为这个问题来自将我的豹子升级到雪豹。我认为这个问题也与macports有关。/usr/local/lib/libz.1.dylib,filewasbuiltfori386whichisnotthearchitecturebeinglinked(x86_64)有什么想法吗?更新更具体地说,这发生在安装nokogirigem时日志看起来像:xslt_stylesheet.c:127:warning:passingargument1of‘Nokogiri_wrap_xml_document’withdifferentwidthduetoproto

  9. ruby - libxml-ruby 无法在 x86_64 上加载 - 2

    我们在服务器端遇到libxml-rubygem的问题可能是因为它使用x86_64架构:$uname-aLinuxip-10-228-171-642.6.21.7-2.fc8xen-ec2-v1.0#1SMPTueSep110:25:30EDT2009x86_64GNU/Linuxrequire'libxml'LoadError:/usr/local/ruby-enterprise/lib/ruby/gems/1.8/gems/libxml-ruby-1.1.4/lib/libxml_ruby.so:invalidELFheader-/usr/local/ruby-enterprise/

  10. 机器学习——时间序列ARIMA模型(四):自相关函数ACF和偏自相关函数PACF用于判断ARIMA模型中p、q参数取值 - 2

    文章目录1、自相关函数ACF2、偏自相关函数PACF3、ARIMA(p,d,q)的阶数判断4、代码实现1、引入所需依赖2、数据读取与处理3、一阶差分与绘图4、ACF5、PACF1、自相关函数ACF自相关函数反映了同一序列在不同时序的取值之间的相关性。公式:ACF(k)=ρk=Cov(yt,yt−k)Var(yt)ACF(k)=\rho_{k}=\frac{Cov(y_{t},y_{t-k})}{Var(y_{t})}ACF(k)=ρk​=Var(yt​)Cov(yt​,yt−k​)​其中分子用于求协方差矩阵,分母用于计算样本方差。求出的ACF值为[-1,1]。但对于一个平稳的AR模型,求出其滞

随机推荐