Peretasan yang agak janggal di sekitar objdump
dan dd
:
IN_F=/bin/echo
OUT_F=./tmp1.bin
SECTION=.text
objdump -h $IN_F |
grep $SECTION |
awk '{print "dd if='$IN_F' of='$OUT_F' bs=1 count=$[0x" $3 "] skip=$[0x" $6 "]"}' |
bash
objdump -h
menghasilkan output yang dapat diprediksi yang berisi offset bagian dalam file elf. Saya membuat awk
untuk menghasilkan dd
perintah untuk shell, sejak dd
tidak mendukung angka heksadesimal. Dan memberi perintah ke shell.
Dulu saya melakukan semua itu secara manual, tanpa membuat skrip apa pun, karena jarang diperlukan.
Gunakan -O binary
format keluaran:
objcopy -O binary --only-section=.text foobar.elf foobar.text
Cukup verifikasi dengan avr-objcopy
dan .text
gambar AVR ELF bagian.
Perhatikan bahwa jika, seperti yang ditunjukkan Tim di bawah, bagian Anda tidak memiliki flag ALLOC, Anda mungkin harus menambahkan --set-section-flags .text=alloc
untuk dapat mengekstraknya.
objcopy --dump-section
Diperkenalkan di Binutils 2.25, dan mencapai efek yang mirip dengan -O binary --only-section
.
Penggunaan:
objcopy --dump-section .text=output.bin input.o
https://sourceware.org/binutils/docs-2.25/binutils/objcopy.html mendokumentasikannya sebagai:
--dump-section sectionname=namaberkas
Tempatkan isi bagian bernama namabagian ke dalam nama file file, timpa semua konten yang mungkin sudah ada sebelumnya. Opsi ini kebalikan dari --add-section. Opsi ini mirip dengan opsi --only-section kecuali bahwa opsi ini tidak membuat file yang diformat, opsi ini hanya membuang konten sebagai data biner mentah, tanpa menerapkan relokasi apa pun. Opsi dapat ditentukan lebih dari sekali.
Contoh minimal yang dapat dijalankan
main.S
.data
.byte 0x12, 0x34, 0x56, 0x78
.text
.byte 0x9A, 0xBC, 0xDE, 0xF0
Merakit:
as -o main.o main.S
Ekstrak data:
objcopy --dump-section .data=data.bin main.o
hd data.bin
Keluaran:
00000000 12 34 56 78 |.4Vx|
00000004
Ekstrak teks:
objcopy --dump-section .text=text.bin main.o
hd text.bin
Keluaran:
00000000 9a bc de f0 |....|
00000004
Diuji di Ubuntu 18.04 amd64, Binutils 2.30.