通过strings二进制文件分析工具排查 version ‘GLIBC_2.25‘ not found 报错

strings命令简介

  • strings命令用于打印文件中可打印字符串, 可以打印文本文件、可执行程序,库文件等。一般用于分析可执行程序和库文件。
  • strings命令较为常用的功能有以下两种
    • 查看系统的GLIBC版本和目标文件的依赖的GLIBC版本,当系统的GLIBC版本与目标文件的依赖的GLIBC版本不匹配时,就会出现version ‘GLIBC_2.25’ not found这种报错
    • 查看某一个函数在哪个文件中

查看系统支持的GLIBC版本和目标程序依赖的GLIBC版本是否匹配

  • 背景知识
    • 在Linux平台下,GLIBC指的是GNU C Library(GNU C标准库),它是Linux操作系统中最基础、最重要的库之一。glibc是实现C语言标准库的开源版本,它为基于Linux系统的程序提供了系统调用接口,并实现了ANSI C、POSIX以及其他许多标准规定的服务。
    • GLIBC不仅包括了基本的C语言函数库如内存管理、字符串操作、数学运算等,还封装了对Linux内核服务的访问,比如文件和目录操作、进程控制、网络通信等功能。几乎所有的Linux应用程序在编译和运行时都会依赖于GLIBC。
    • libc.so.6 是 GLIBC 在Linux系统中的一个具体实现文件,提供了C语言标准库和其他系统接口功能的实际代码。
  • 可以通过以下命令来查看当前系统支持的GLIBC版本
    • strings /lib64/libc.so.6 | grep GLIBC
  • 在centos7系统执行 strings /lib64/libc.so.6 | grep GLIBC,会看到以下打印
  •   GLIBC_2.2.5
      GLIBC_2.2.6
      GLIBC_2.3
      GLIBC_2.3.2
      GLIBC_2.3.3
      GLIBC_2.3.4
      GLIBC_2.4
      GLIBC_2.5
      GLIBC_2.6
      GLIBC_2.7
      GLIBC_2.8
      GLIBC_2.9
      GLIBC_2.10
      GLIBC_2.11
      GLIBC_2.12
      GLIBC_2.13
      GLIBC_2.14
      GLIBC_2.15
      GLIBC_2.16
      GLIBC_2.17
    
  • 说明centos7 系统支持的最低GLIBC版本为2.2.5,支持的最高GLIBC版本为 2.17
  • ubuntu18 系统上执行 strings /lib/x86_64-linux-gnu/libc.so.6 | grep GLIBC
  •   GLIBC_2.2.5
      GLIBC_2.2.6
      GLIBC_2.3
      GLIBC_2.3.2
      GLIBC_2.3.3
      GLIBC_2.3.4
      GLIBC_2.4
      GLIBC_2.5
      GLIBC_2.6
      GLIBC_2.7
      GLIBC_2.8
      GLIBC_2.9
      GLIBC_2.10
      GLIBC_2.11
      GLIBC_2.12
      GLIBC_2.13
      GLIBC_2.14
      GLIBC_2.15
      GLIBC_2.16
      GLIBC_2.17
      GLIBC_2.18
      GLIBC_2.22
      GLIBC_2.23
      GLIBC_2.24
      GLIBC_2.25
      GLIBC_2.26
      GLIBC_2.27
    
  • 可以看到 ubuntu18 支持的最低GLIBC版本为2.2.5,支持的最高GLIBC版本为2.27
  • 在ubuntu18 上编译一个openssl库,可以看下其依赖的GLIBC版本
  • strings libcrypto.so.1.1 | grep GLIBC
  •   GLIBC_2.2.5
      GLIBC_2.3
      GLIBC_2.16
      GLIBC_2.7
      GLIBC_2.14
      GLIBC_2.3.2
      GLIBC_2.25
      GLIBC_2.3.4
      GLIBC_2.17
    
  • 可以看到libcrypto.so.1.1依赖的GLIBC版本有2.25、2.3。这些版本在centos7系统上都是不支持的
  • 如果把ubuntu18上编译的程序拿到 centos7上运行,就会出现如下报错。找不到 GLIBC_2.25 这个版本。
  •   [root@localhost er]# ls
      libcrypto.so.1.1  libssl.so.1.1  SSLClient
      [root@localhost er]# ./SSLClient
      ./SSLClient: /lib64/libc.so.6: version `GLIBC_2.25' not found (required by ./libcrypto.so.1.1)
      [root@localhost er]#
    
  • 这种场景在实际中还是很常见的,如果出现这种报错,就可以使用strings命令,查看报错系统的GLIBC版本,然后再查看我们的可执行程序或依赖库,哪些依赖的GLIBC版本较高,重新在低版本系统上编译替换即可。

解决方案-重点备注

  • 出现上面这种报错,如果是自己写的程序报错,我们可以找个低版本的系统重新编译,如果是第三方库报错,找对应的源码在低版本系统上编译。
  • 我看到一些文章是通过下载高版本的GLIBC库编译后安装替换低版本的GLIBC库解决这个问题,相较于找低版本系统和编译第三方源码,这种方法确实更简单和方便。
  • 但还是不推荐这么做,因为 GLIBC库 是linux系统最基础的库,一旦我们编译替换GLIBC库的过程中出错,损坏了libc.so.6文件,那么大多数命令都将无法使用,甚至无法进入系统。如果是自己的测试机还好,要是搞坏服务器或者用户电脑的libc.so.6库,导致系统无法正常使用,后果是很严重的。
  • 我们平时也千万不要随便去删除,修改或者重命名libc.so.6这个文件,如果真的不小心损坏了,可参考以下方法去补救。

查看函数在哪个文件中

  • 还可以使用strings命令查看某一个函数在指定目录中的哪个文件中
  •   [root@localhost er]# rm -rf src/
      [root@localhost er]# ls
      libcrypto.so.1.1  libssl.so.1.1  SSLClient
      [root@localhost er]# strings -f ./* | grep "SSL_write"
      ./libssl.so.1.1: SSL_write
      ./libssl.so.1.1: SSL_write_ex
      ./libssl.so.1.1: SSL_write_early_data
      ./libssl.so.1.1: SSL_write
      ./libssl.so.1.1: SSL_write_early_data
      ./libssl.so.1.1: SSL_write_ex
      ./libssl.so.1.1: SSL_write_early_data
      ./libssl.so.1.1: SSL_write_ex
      ./libssl.so.1.1: SSL_write
      ./SSLClient: SSL_write
      ./SSLClient: SSL_write@@OPENSSL_1_1_0
    
  • 可以看到SSL_write函数在当前目录下的libssl.so.1.1库文件中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大草原的小灰灰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值