如何解决如何将ELF文件的内容转储到特定地址?
使用GDB,如果我加载ELF图像并为其指定地址,则可以使GDB在该地址转储ELF文件的内容。例如:
p *((MYSTRUCT *)0x06f8f5b0)
$1 = {
filename = 0x6f8f5e0 <bla> "this is a string",format = 0x6f8f640 <pvt> "This is another string!\n",lineNumber = 148,argumentCount = 0 '\000',printLevel = 1 '\001'}
之所以可行,是因为GDB加载了ELF图像并解析了其重定位表,并且它也知道MYSTRUCT的布局。
如果没有GDB,我该怎么做?我实际上并不真正在乎解析MYSTRUCT。我只想在位置0x06f8f5b0处转储20个字节。我曾尝试过使用readelf和objdump,但无法获得想要的东西。
Python代码(例如使用pyelftools)也是可以接受的。
解决方法
我只想在位置0x06f8f5b0处转储20个字节。
您的问题仅在位置相关(即ET_EXEC
)二进制文件(任何其他二进制文件可以加载到任意地址)的情况下才有意义。
对于与位置相关的二进制文件,答案非常简单:
- 遍历程序头,直到找到一个“覆盖”所需地址的头
- 从
.p_vaddr
和.p_offset
中计算文件中的偏移量 - 使用
lseek
和read
读取感兴趣的字节。
为了更加具体,这是一个示例:
// main.c
const char foo[] = "This is the song that never ends.";
int main() { printf("&foo = %p\n",&foo[0]); return 0; }
gcc -w -no-pie main.c
./a.out ; ./a.out
&foo = 0x402020
&foo = 0x402020
readelf -Wl a.out | grep LOAD
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
LOAD 0x000000 0x0000000000400000 0x0000000000400000 0x000438 0x000438 R 0x1000
LOAD 0x001000 0x0000000000401000 0x0000000000401000 0x0001bd 0x0001bd R E 0x1000
LOAD 0x002000 0x0000000000402000 0x0000000000402000 0x000190 0x000190 R 0x1000
LOAD 0x002e10 0x0000000000403e10 0x0000000000403e10 0x000220 0x000228 RW 0x1000
我们在这里看到我们关心的地址是第3个LOAD
段中的0x20字节,该段从文件中的偏移量0x002000
开始。
因此,我们感兴趣的字节在文件中的偏移量0x2020
处。
让我们检查一下:
dd if=a.out bs=1 count=15 skip=$((0x002020)) 2>/dev/null
This is the son
QED。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。