[Pwn之路]根据所给库,获得远程同环境——使用patchelf的正确姿势
原文:https://www.freebuf.com/sectool/366854.html
存自己這里方便看。
0x00 前言
如何修改本地pwn文件和題目所給環境一致,從而進行調試,這是從學習堆開始就遇到的心頭之患。從那以后,直到今天參加完mini LCTF,為了復現一道題目才把這個問題解決掉。網上的博客,參差不齊,由于本人不才,導致都不起作用。故在某學長在校內論壇之中找到正確方法,從而解決了這一心頭之患。
并且這里面有一些小問題,也希望請教一下大家。問題我會用Q來表示,歡迎捕捉!
0x01 安裝所需軟件
glibc-all-in-one
最快的方式是:
git clone https://github.com/matrix1001/glibc-all-in-one.git
cd glibc-all-in-one
chmod a+x build download extract
如果不行(我就是不行…),進入下方鏈接。
ps:后來發現是ipv6掉認證了

點擊download下載,手動解壓
然后運行sudo python update_list(如果遇到報錯請檢查網絡問題,我在那里卡了比較久,注意要用direct連接。這里不明白什么意思的話不用管我),接著cat list得到包名。

patchelf
我是archlinux,yay patchelf就可以安裝好,所以在這里沒有遇到什么問題。其他子系統,可以自行搜索,網上的教程很詳細,大家可以自行解決。
0x02 確定patch什么庫
修改:新增快方法
在有題目所給libc.so.6的目錄下直接輸入strings libc.so.6 |grep Ubuntu 即可。

1.確定偏移用于搜索
使用ROPgadget
這里的思路我的比較簡單,ROPgadget用來查str_bin_sh的地址。
ROPgadget --binary libc.so.6 --string '/bin/sh'
得到

Q1:那么有沒有辦法用ROP來查printf,system之類的地址呢?我暫時沒查到相關命令,如果有的話會很簡單,不需要接下來的步驟。
使用pwntools
from pwn import *
p = process('./pwn')
libc = ELF('./libc.so.6')
elf = ELF('./pwn')
system = libc.sym['system']#這里的system可以替換成別的函數,用于搜索偏移
print(hex(system))
if args.G:
gdb.attach(p)
p.interactive()
運行。

于是我們得知,system的偏移是0x50d60
3.搜索庫
推薦兩個網站一起用,找不到的話換另一個,一定要多搜索幾個偏移確保沒錯。其實也可以使用libc-database,不過這個不是這篇文章的重點。
https://libc.rip/
https://libc.blukat.me/

得到庫名。
0x03 下載庫
運行cat list找到2.35-0ubuntu3.1_amd64。

cd到年裝的glibcallinone的文件夾下。
輸入./download 2.35-0ubuntu3.1_amd64即可。
但是我一開始不太一樣,我遇到了問題如下:
~/ctf/tools/glibcallinone ? ./download 2.35-0ubuntu3.1_amd64
Getting 2.35-0ubuntu3.1_amd64 -> Location:
https://mirror.tuna.tsinghua.edu.cn/ubuntu/pool/main/g/glibc/libc6_2.35-0ubuntu3.1_amd64.deb
-> Downloading libc binary package Failed to download package from https://mirror.tuna.tsinghua.edu.cn/ubuntu/pool/main/g/glibc/libc6_2.35-0ubuntu3.1_amd64.deb
于是只能自己登入,然后解壓。
后來發現是沒安裝wget且校園網ipv6掉認證,重新登陸一下后成功。

0x04 patch!!
找到你的ld和libc.so.6文件。

找到他們的目錄,然后在pwn題目文件目錄下運行以下兩條命令:
patchelf --set-interpreter 你的文件目錄/ld-linux-x86-64.so.2 ./pwn
patchelf --add-needed 你的文件目錄/libc.so.6 ./pwn
patchelf --add-needed 你的目錄/libpthread.so.0 ./pwn (如果提示沒有libpthread.so.0的話)
大功告成。
尾聲
動態調試是pwn中必不可少的重要步驟,而patch則是讓我們能夠動態調試的必由之路。歡迎有任何問題在評論區提出,我們將繼續努力走向更高處。
當你沒有符號表?
https://loora1n.github.io/2022/11/01/【祥云杯2022】PWN-WriteUp-protocol/
總結
以上是生活随笔為你收集整理的[Pwn之路]根据所给库,获得远程同环境——使用patchelf的正确姿势的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux-服务操作和运行级别和关机重启
- 下一篇: Python - 作为浅拷贝的list对