Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何仅提取ELF节的原始内容?_Linux_Shell_Elf_Binutils - Fatal编程技术网

Linux 如何仅提取ELF节的原始内容?

Linux 如何仅提取ELF节的原始内容?,linux,shell,elf,binutils,Linux,Shell,Elf,Binutils,我尝试了以下方法,但生成的文件仍然是一个ELF,而不仅仅是节内容 $ objcopy --only-section=<name> <infile> <outfile> $objcopy--仅节= 我只想要这一节的内容。有什么实用程序可以做到这一点吗?有什么想法吗?使用-O二进制输出格式: objcopy -O binary --only-section=.text foobar.elf foobar.text 只需使用avr objcopy和avr EL

我尝试了以下方法,但生成的文件仍然是一个ELF,而不仅仅是节内容

$ objcopy --only-section=<name> <infile> <outfile>
$objcopy--仅节=

我只想要这一节的内容。有什么实用程序可以做到这一点吗?有什么想法吗?

使用
-O二进制输出格式:

objcopy -O binary --only-section=.text foobar.elf foobar.text
只需使用avr objcopy和avr ELF图像的
.text
部分进行验证


请注意,如Tim在下面指出的,如果您的分区没有ALLOC标志,您可能必须添加
——设置分区标志。text=ALLOC
,才能将其提取出来。

objdump
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
生成可预测的输出,其中包含elf文件中的段偏移量。我使用
awk
为shell生成
dd
命令,因为
dd
不支持十六进制数。并将命令发送给壳牌公司

过去,我都是手动完成的,没有编写任何脚本,因为它很少需要。

objcopy——转储部分

在Binutils 2.25中引入,并实现了与
-O binary--only部分类似的效果

用法:

objcopy --dump-section .text=output.bin input.o
将其记录为:

--转储节sectionname=filename

将名为sectionname的节的内容放入文件名,覆盖以前可能存在的任何内容。此选项与--add section相反。此选项类似于--only节选项,只是它不创建格式化文件,只将内容作为原始二进制数据转储,而不应用任何重新定位。可以多次指定该选项

最小可运行示例

梅因

.data
    .byte 0x12, 0x34, 0x56, 0x78
.text
    .byte 0x9A, 0xBC, 0xDE, 0xF0
汇编:

as -o main.o main.S
提取数据:

objcopy --dump-section .data=data.bin main.o
hd data.bin
输出:

00000000  12 34 56 78                                       |.4Vx|
00000004
00000000  9a bc de f0                                       |....|
00000004
提取文本:

objcopy --dump-section .text=text.bin main.o
hd text.bin
输出:

00000000  12 34 56 78                                       |.4Vx|
00000004
00000000  9a bc de f0                                       |....|
00000004

在Ubuntu 18.04 amd64、Binutils 2.30中测试。

将所有部分转储到单独的文件中

readelf -a filename|grep "NULL\|LOAD"| (x=0;while read a;do echo "$x $a"|awk '{print "dd if=143 of=filename.section."$1" bs=1 skip=$((" $3")) count=$(("$6"))"}';let x=x+1;done)|bash

当我添加这个时,结果是空的。它既不包含ELF节头也不包含节内容。我在问题中使用的命令不会生成空文件。以下命令对我有效:objcopy-O binary-j.text/usr/bin/lpr mylprtext这个简洁的技巧并不适用于所有部分<代码>对象复制
不会复制标记为既未加载(“加载”)也未分配(“分配”)的节。源代码中的一条评论声称“这样一个节的内容在二进制格式中没有意义。”奇怪的是,objcopy打印:当objdump正常打印节时,无法识别输入文件“elf.img”的格式。这与--set节标志一起允许我将.ARM.attributes转储到文件中。不会用棍子碰另一个答案中的awk脚本;)+1.听我说,这听起来很有趣,但是为什么不直接使用@ndim的正确解决方案呢?如果另一个解决方案生成的文件是0字节,只需在命令行上添加
--设置节标志。sectionname=alloc
。好主意,但对我来说不起作用。。看看我的答案,这是相似的。这应该是最好的答案。