Kapan saya bisa mengedit string dalam biner yang dapat dieksekusi?

11

Saya memiliki biner yang dapat dieksekusi; sebut saja itu a.out. Saya bisa melihat biner berisi string

$ strings a.out
...
/usr/share/foo
....

Saya perlu mengubah string /usr/share/fooke /usr/share/bar. Bisakah saya hanya mengganti string dengan sed?:

sed -i 's@/usr/share/foo@/usr/share/bar@' a.out

Ini sepertinya hal yang aman untuk dilakukan. Apakah ini juga akan berfungsi jika senarnya tidak sama panjang?

Martin Vegter
sumber

Jawaban:

17

Saya tidak tahu apakah versi Anda sedakan biner-bersih atau jika akan tersedak apa yang dianggapnya adalah garis yang panjang dalam inputnya, tetapi jika tidak ada masalah itu, mengedit string di tempat harusnya berfungsi. Untuk melihat apakah benar, bandingkan dengan versi lama dan baru cmp -l. Ini akan memberi tahu Anda apakah hanya tiga perbedaan antara kedua file tersebut yaitu 3 byte.

Mengedit string dalam executable yang dikompilasi memang akan berfungsi jika string memiliki panjang yang sama, tetapi hampir selalu juga berfungsi jika Anda memperpendek string, karena cara string bekerja dalam C. Dalam string C, semuanya setelah NULterminator tidak masuk hitungan, jadi jika Anda menulis NULterminator baru sebelum posisi yang lama, Anda akan secara efektif mempersingkat string.

Secara umum, tidak ada cara Anda dapat memperpanjang string menggunakan hack ini.

Celada
sumber
Bagaimana dengan memperpendek string dengan sesuatu seperti sed -i 's@longstring@foo@' a.out? Ini akan membuat seluruh biner lebih kecil dengan 7 byte, Apakah ini tidak akan merusak biner?
Martin Vegter
Ya, itu akan merusak biner. Itu sebabnya Anda harus menerjemahkan string ke salah satu dari panjang yang sama persis, tetapi atur NULterminator pada posisi sebelumnya seperti yang saya jelaskan (walaupun mungkin terlalu singkat). Masalahnya adalah Anda tidak dapat memiliki NULbyte pada baris perintah sehingga Anda harus meletakkan sedprogram Anda ke dalam file dan merujuknya -f. Di sisi lain, hal yang lebih aman untuk dilakukan adalah dengan menggunakan alat yang dirancang untuk bekerja dengan data biner daripada sedyang dirancang untuk bekerja dengan data teks.
Celada
2
Jawaban yang bagus. sed dapat melakukan banyak hal, tetapi, secara umum, itulah yang diciptakan oleh editor biner. Mereka bisa jadi menantang untuk digunakan ketika menavigasi dalam file biner besar, tetapi mereka akan membiarkan Anda mengubah hal-hal byte demi byte. Saya gunakan hexeditketika saya harus memeriksa atau mengubah file biner. Anda dapat menggunakan strings -t x file | lessuntuk menemukan offset dari string (yang dapat dicetak) yang ingin Anda ubah sebelum masuk ke dalam editor.
Joe
Katakanlah saya memiliki string dalam program C saya: "Namaku Mr Robot" dan saya ingin mengganti 'was' dengan 'is', maka padding \0harus dilakukan dengan hati-hati, karena jika penggantian melakukan ini: "Nama saya adalah \ 0 Mr Robot ", lalu saat melakukan operasi dengan string, karakter '\ 0' akan menimbulkan masalah karena panjangnya akan berkurang secara tidak sengaja.
Nehal J Wani
@NehalJWani tidak, dalam hal ini Anda harus menggeser seluruh sisa string ke depan dengan satu byte sehingga Anda baru, ekstra, mengakhiri NULdi akhir, berdekatan dengan yang sudah ada NUL.
Celada