Share this post on:

glibc更换综合方案

by肖哥

原文位置

此方法只适用于glibc2.31之前的版本

  • 前置工具安装 elfutils

    sudo aptitude install elfutils
  • 寻找对应版本的libc

  • 获取libc

    wget http://launchpadlibrarian.net/497108893/libc6_2.27-3ubuntu1.3_amd64.deb 
    wget http://launchpadlibrarian.net/497108885/libc6-dbg_2.27-3ubuntu1.3_amd64.deb
  • 解压

    dpkg-deb -x libc6_2.27-3ubuntu1.3_amd64.deb ./libc
    dpkg-deb -x libc6-dbg_2.27-3ubuntu1.3_amd64.deb ./sym
  • 结合libc与libc_debug文件

    sudo eu-unstrip libc-2.27.so libc-2.27_sym.so
  • 注意这里可能需要给libc和ld加一下执行权限

看雪的另一篇文章

原文位置

  • 这里使用 glibc-all-in-one来下载,然后可以使用大佬的自动化脚本来完成

    #chlibs.sh
    set -x
    libc_path=$1
    elf_path=$2
    patchelf_bin_path="/path/to/patchelf"
    if [ -f ${libc_path}/ld-[2].[0-9][0-9].so ]; then
      $patchelf_bin_path --set-interpreter $libc_path/ld-[2].[0-9][0-9].so $elf_path
    fi
    if [ -f $libc_path/libc-[2].[0-9][0-9].so ]; then
      $patchelf_bin_path --replace-needed libc.so.6 $libc_path/libc-[2].[0-9][0-9].so $elf_path
    fi
    set +x

    使用格式:

    ./chlibs.sh [我的libc所在目录] [目标文件]
  • 这里有一个问题,glibc-all-in-one有时候不能下载,那么这时候就通过寻找它下载的路径通过 wget 手动下载,这样后续的方法就参照前一个方案(从获取libc开始)

glibc2.31以上的版本

  • 通过 glibc-all-in-one 下载好对应的glibc,此时调试符号被保存为一个 debug 文件,要加载调试符号就需要在gdb当中手动加载

  • 单次调试可以直接在gdb中更改寻找调试信息的路径

    • 查看当前调试信息的路径
    show debug-file-directory
    • 设置调试信息路径(仅单次有用,下次启动gdb时还是默认的)
    set debug-file-directory [directories]
  • 还有是直接替换掉gdb的调试信息文件,这样就不用去设置了,且在附加调试时只能用这种方法

    # 这里是替换.build-id文件夹(主要参考命令)
    cd /usr/lib/debug
    sudo mv .build-id/ .build-id.bak
    cd ~
    sudo mv ~/.build-id/ /usr/lib/debug

更换libc步骤

直接更换

  • 替换libc

    patchelf --replace-needed libc.so.6 ./libc-2.27.so ./pwn
    -------------------------原本的libc----要替换的libc-----pwn文件       
  • 替换ld文件

    patchelf --set-interpreter ./ld-2.27.so ./pwn
    ---------------------------对应的ld文件----pwn文件

exp运行时更换

p = process(['/2.27-3ubuntu1_amd64/ld-2.27.so', './pwn'], env={"LD_PRELOAD":'/2.27-3ubuntu1_amd64/libc.so.6'})
Share this post on:

Leave a Comment

您的邮箱地址不会被公开。 必填项已用 * 标注