同时使用多种版本的libc && 编译libc

参考: https://bbs.pediy.com/thread-225849.htm

做pwn题的时候经常会遇到不同的libc, 最简单的解决方法就是LD_PRELOAD了, 不过这个方法有一个局限. 就是如果libc的版本差太多的话就没办法使用了. 毕竟LD_PRELOAD只是告诉ld.so该去哪儿加载libc, 可是ld.so也没有办法去加载不同版本的libc
于是我就只能傻乎乎地配了三个ubuntu的pwn环境, 虽然有docker可以用, 可是感觉在虚拟机里面又装一层docker实在有点蠢.... 总之既浪费时间又浪费空间
通过上面的帖子我才发现其实是可以在一个ubuntu中使用多个版本的libc的, 只要修改程序使得其使用对应版本的ld.so即可

elf文件有个段 PT_INTERP, 其中存储了程序使用的ld.so的路径, 默认是这样


默认使用 /lib64/ld-linux-x86-64.so.2

我们通过上面链接里面给出的脚本可以修改程序的这个段的内容, 使得其启动的时候使用我们提供的ld.so, 然后我们就可以修改其为特定版本的ld.so从而达到使用不同版本libc的目的了
下面就是修改为2.24版本的ld.so其使用 libc2.24


使用2.24版本的ld.so

我发现如果使用自己编译的libc的话即使不使用LD_PRELOAD它也会找到对应的libc, 而不是默认的 /lib/x86_64-linux-gnu/libc.so.6, 应该是在ld.so里面记录了libc的路径.


没有使用LD_PRELOAD也会找到对应的libc

而且我们还可以下载libc 2.24的源码从而实现源码级调试的目的. (具体操作参考这个SO)

源码调试malloc

贴一下我自己的脚本, 相比原帖修改了2点:

  1. 将修改后的文件就放在当前文件夹而不是/tmp/pwn/下
  2. 修改后的文件添加一个后缀, 表示使用的是哪个版本的ld.so, 因为现在经常有些题目不给libc.... 可能得试好几个
#coding:utf-8
from pwn import *
import os
def change_ld(binary, ld):
    if not os.access(ld, os.R_OK): 
      log.failure("Invalid path {} to ld".format(ld))
      return None
    if not os.access(binary, os.R_OK): 
      log.failure("Invalid path {} to binary".format(binary))
      return None
    binary = ELF(binary)
    path = './{}_{}'.format(os.path.basename(binary.path), ld.split('.')[-2])
    if os.access(path, os.F_OK):
      os.remove(path)
      print("remove exist file.....")
      return ELF(path)
    for segment in binary.segments:
      if segment.header['p_type'] == 'PT_INTERP':
        size = segment.header['p_memsz']
        addr = segment.header['p_paddr']
        data = segment.data()
        if size <= len(ld):
          log.failure("Failed to change PT_INTERP from {} to {}".
            format(data, ld))
          return None
        binary.write(addr, ld.ljust(size, '\x00'))
        break
    binary.save(path)    
    os.chmod(path, 0b111000000) #rwx------
    success("PT_INTERP has changed from {} to {}. Using temp file {}".format(data, ld, path)) 
    return ELF(path)

这个仓库里面有编译好的各个版本的libc.so和ld.so

不过我还是建议自己编译libc, 一个版本也就20分钟不到就编译好了. 之后调试的时候会很方便

下面大概简单说了一下我编译libc的过程. 大家可以参考一下

Appendix: 编译libc

官方编译教程
注意:
本教程没有考虑到编译过程中可能需要某些诸如gcc之类软件依赖的情况.
环境:

Ubuntu 16.04 server版

  1. 下载glibc:
    我选择的是glibc_*.tar.gz版本
    1. 官网
    2. 教育网可以选择清华的镜像站
  2. 解压
    尽量不要再虚拟机的共享文件夹下解压, 可能会出现莫名其妙的问题, 速度可能也会很慢
    a. tar -xvf glibc_*.tar.gz
    b. 可以看到一个新的文件夹, 然后我们再新建两个文件夹用来存储编译结果:


    image.png

第一文件夹是解压得到的, 后两个是新建的

  1. 配置编译参数
    a. 进入 *_build文件夹, 执行
../glibc-2.24/configure  '--prefix=/home/pu1p/glibcs/glibc-2.24_out'

这儿解释一下, glibc编译的时候需要在一个新的文件夹下编译, 不允许在源代码的目录中编译.
编译完成后还会产生一些诸如ldd等二进制文件,最好使用--prefix声明一个文件夹来存储这些产生的文件, 否则如果存储到默认路径/usr/local可能会影响系统的正常运行

  1. make:
    a. make (大概10min)
    b. make install (大概2min)
  2. 寻找libc.so 和 ld.so
    a. libc.so 就在glibc-2.24_build目录下
    b. ld.so 就在glibc-2.24_build/elf 目录下

Update

  1. ubuntu 18.04 下编译 glibc 2.23 会遇到各种问题, 解决方法可以参考这个博客
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,875评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,569评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,475评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,459评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,537评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,563评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,580评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,326评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,773评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,086评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,252评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,921评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,566评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,190评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,435评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,129评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,125评论 2 352

推荐阅读更多精彩内容

  • 一、温故而知新 1. 内存不够怎么办 内存简单分配策略的问题地址空间不隔离内存使用效率低程序运行的地址不确定 关于...
    SeanCST阅读 7,796评论 0 27
  • 动态链接,在可执行文件装载时或运行时,由操作系统的装载程序加载库。大多数操作系统将解析外部引用(比如库)作为加载过...
    小5筒阅读 5,497评论 0 3
  • 源码编译安装,关键是恢复、比对。备份系统文件,用Live系统恢复原系统状态;比对发行版包管理器软件包的安装路径,移...
    MrChenyz阅读 5,623评论 0 0
  • 1. 介绍 使用GNU的工具我们如何在Linux下创建自己的程序函数库?一个“程序函数库”简单的说就是一个文件包含...
    逍遥_9353阅读 1,584评论 0 2
  • 今天,猴年就要结束了。 这一年,匆匆赶路,有收获、有失去。这一年,不曾开心的笑,也不曾纵情地哭。相遇一些人,共过一...
    董董23阅读 168评论 0 0