[Pwn之路]根据所给库,获得远程同环境——使用patchelf的正确姿势
原文:https://www.freebuf.com/sectool/366854.html
存自己這里方便看。
0x00 前言
如何修改本地pwn文件和題目所給環(huán)境一致,從而進(jìn)行調(diào)試,這是從學(xué)習(xí)堆開(kāi)始就遇到的心頭之患。從那以后,直到今天參加完mini LCTF,為了復(fù)現(xiàn)一道題目才把這個(gè)問(wèn)題解決掉。網(wǎng)上的博客,參差不齊,由于本人不才,導(dǎo)致都不起作用。故在某學(xué)長(zhǎng)在校內(nèi)論壇之中找到正確方法,從而解決了這一心頭之患。
并且這里面有一些小問(wèn)題,也希望請(qǐng)教一下大家。問(wèn)題我會(huì)用Q來(lái)表示,歡迎捕捉!
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
如果不行(我就是不行…),進(jìn)入下方鏈接。
ps:后來(lái)發(fā)現(xiàn)是ipv6掉認(rèn)證了

點(diǎn)擊download下載,手動(dòng)解壓
然后運(yùn)行sudo python update_list(如果遇到報(bào)錯(cuò)請(qǐng)檢查網(wǎng)絡(luò)問(wèn)題,我在那里卡了比較久,注意要用direct連接。這里不明白什么意思的話不用管我),接著cat list得到包名。

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

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

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

于是我們得知,system的偏移是0x50d60
3.搜索庫(kù)
推薦兩個(gè)網(wǎng)站一起用,找不到的話換另一個(gè),一定要多搜索幾個(gè)偏移確保沒(méi)錯(cuò)。其實(shí)也可以使用libc-database,不過(guò)這個(gè)不是這篇文章的重點(diǎn)。
https://libc.rip/
https://libc.blukat.me/

得到庫(kù)名。
0x03 下載庫(kù)
運(yùn)行cat list找到2.35-0ubuntu3.1_amd64。

cd到年裝的glibcallinone的文件夾下。
輸入./download 2.35-0ubuntu3.1_amd64即可。
但是我一開(kāi)始不太一樣,我遇到了問(wèn)題如下:
~/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
于是只能自己登入,然后解壓。
后來(lái)發(fā)現(xiàn)是沒(méi)安裝wget且校園網(wǎng)ipv6掉認(rèn)證,重新登陸一下后成功。

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

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