更換可執行文件glibc版本的某一次掙扎
0x00:前言
在做pwn的堆題時,會遇到不同版本的glibc。為此我們會裝不同版本的虛擬機去應對。一般來說會裝Ubuntu16和Ubuntu18虛擬機,這兩個系統對應的glibc版本差別較大,且較常見。但其余的glibc版本也會存在一些小差別,主要在于malloc和free時的檢查。為了更好地與遠程環境對應,我們可以通過patchelf和glibc-all-in-one來更換程序動態加載時的glibc。
簡單介紹一下,glibc-all-in-one用來下載需要的glibc包,然后用petchelf進行更換操作。
0x01:patchelf
安裝命令:
sudo apt install patchelf
檢查一下:
patchelf -h

0x02:glibc-all-in-one
1、下載glibc-all-in-on
從github克隆:
git clone https://github.com/matrix1001/glibc-all-in-one
2、更新glibc版本信息
進入glibc-all-in-one目錄,執行update_list文件,更新glibc版本信息列表。
初始時是這樣子的:

更新之后生成了list和old_list文件:

打開查看這兩個文件發現是互補的,根據上面更新的完成信息,個人推斷:list中的glibc版本是目前系統常用的可用的,而old_list中的是過時的,或者是這些版本存在一些問題,不推薦使用。(個人推測,保留質疑)

3、下載需要的glibc
查看版本信息文件:
cat list
下載glibc:
./dawnload [版本號]

也可以下載old_list里面對應的glibc,不過要用./download_old進行下載操作。(用./download會報錯)
0x03:更換glibc
更換鏈接器:
patchelf --set-interpreter /home/tolele/pwn_tools/glibc-all-in-one/libs/2.23-0ubuntu3_amd64/ld-2.23.so ./easy_heap
更換glibc搜索路徑:
patchelf --set-rpath /home/tolele/pwn_tools/glibc-all-in-one/libs/2.23-0ubuntu3_amd64 ./easy_heap
(注意路徑和可執行文件(參數)要按自己的來修改)

其實還有另外一種方法:更換鏈接器+直接更換動態庫
更換鏈接器命令:
patchelf --set-interpreter /home/tolele/pwn_tools/glibc-all-in-one/libs/2.23-0ubuntu3_amd64/ld-2.23.so ./easy_heap
更換動態庫:(參數libc.so.6似乎是固定的)
patchelf --replace-needed libc.so.6 /home/tolele/pwn_tools/glibc-all-in-one/libs/2.23-0ubuntu3_amd64/libc.so.6 ./easy_heap
但這種方法沒前面一種方法好,容易報錯。
0x04:渡劫之道
眾所周知,環境配置除了正常的操作之外,還需要運氣加成,你往往不知道你會遇到什么千奇百怪的error。本人在u18環境配置地比較順,但在u16第一步就報錯了,來了個開門紅,接下來更是紅紅(error)火火(怒火)。
如果你不幸在第一步安裝patchelf時就報錯了,百度無果之后。可以選擇直接從github克隆下來(參考下方第一個鏈接),但渡劫之道可能也因此打開:
1、起點
(3條消息)【kali】glibc-all-in-one安裝(解決version `GLIBC_2.34‘not found)_雪月三十的博客-CSDN博客_glibc-all-in-one
2、patchelf make報錯
(3條消息)安裝patchelf無法make(make報錯很多)_Der_的博客-CSDN博客_patchelf安裝
3、gcc版本低報錯,更新gcc
(3條消息) ubuntu16.04下更新GCC版本_easy_簡兮的博客-CSDN博客
4、更新過程中一個包校驗報錯
(3條消息)【linux】gcc版本更新_shuaixio的博客-CSDN博客_gcc更新
5、遞歸回去
以上為個人在u16的渡劫之道,系統環境不同會導致每個人的道路也會有所不同。望成功!(抱拳)
2022-08-16 更新一下
更換libc和ld后,存在的一個問題是使用gdb調試時,如果用pwndbg插件,heap和bins指令用不了。本來想解決問題再來更新,但網上的方法試了個遍也沒解決。所以先鴿了,或許在深入底層學習的某一天,忽然靈光乍現,解決了再來更新。目前的解決方法是通其它的gdb命令來查看heap和bins的信息,畢竟p &[struct]還是挺好使的。main_arena、vmmap看堆基址、IO的_IO_list_all等等結構體,可以慢慢試試~
2022-09-11 該問題有點眉目了捏,更新一下
先說說網上常見的解決方法:
我們通過glibc-all-in-one下載好libc包后,該目錄下有個.debug文件夾(是個隱藏文件,可通過ls -a查看)。.debug文件含有該libc下的調試信息,只要我們將gdb調試時調試信息的尋找路徑改對應到.debug即可。
這里有兩種方法進行修改:
第一種就是在gdb調試時,使用set debug-file-directory [directories]命令進行修改。show debug-file-directory查看該路徑。但這個方法只是該次有效,當重新gdb調試時需要再次設置。
第二種方法就是gdb調試尋找調試信息文件的默認路徑是:/usr/lib/debug/。所以我們可以先將debug文件夾備份好,然后將glibc-all-in-one中的.debug修改為debug并放到該路徑下即可。
這里放一下e4l4師傅的shell命令:
# 這里是替換.build-id文件夾(主要參考命令)
cd /usr/lib/debug
sudo mv .build-id/ .build-id.bak
cd ~
sudo mv ~/.build-id/ /usr/lib/debug
不過,很可惜的是,上面兩種方法我在ubuntu16.04里面試了都不行,其他師傅說沒問題,那應該也是可以的。最后在ubuntu22.04里面,發現不用替換調試文件也能直接使用heap/bins命令,這樣的話說明調試信息文件是高版本向低版本兼容的。所以最后一條路就是換個高版本點的環境,u20差不多就可以了。
tolele
2022-07-29

浙公網安備 33010602011771號