如何提取ELF文件(C程序的可执行文件)的数据?
How to Extract Data of ELF file (Executable of C program)?
编辑:仍然没有答案有效,输出是:
401bc0 3d2a323d 333a7b3d 3a3a =*2=3:{=::
我试过 =*2=3:{=:: 作为密码,但它是错误的(注意使用小端)
我不同意提供的答案,最重要的是不明白为什么我做错了,我正在检查 ELF 格式的可执行文件(来自 C)。
现在,我知道以下大小为 10 的字符数组包含一个秘密密码,我想找到它。
另外,我知道它位于地址 0x401bc0
。
char foor [10] = {0x??, 0x??, 0x??, 0x??, 0x??, 0x??, 0x??, 0x??, 0x??, 0x??, };
所以,我打开了 elf 文件,计算了 0xbc0 个字节(等于 4660)并开始写入我看到的前 10 个 (为什么我只计算了 0xbc0?因为根据我的第二个输出使用readelf 命令我看到 Load 部分在内存中从 0x400000 开始,它的偏移量在我的文件中是 0x0) ,我得到:
char foo[10] = {0xC3, 0x82, 0x66, 0xC6, 0x92, 0xC3, 0xB9, 0x03, 0x0F, 0xE2,};
但是错了,为什么?
我怎么知道,当我将这个字符数组转换为字符串并将其作为我程序的输入输入时,它说密码错误。
我的ELF文件(如果太长请见谅):https://justpaste.it/51sbe
另外我得到了这个:
readelf -l prog.html
Elf file type is EXEC (Executable file)
Entry point 0x4004fc
There are 9 program headers, starting at offset 64
Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
PHDR 0x0000000000000040 0x0000000000400040 0x0000000000400040
0x00000000000001f8 0x00000000000001f8 R E 0x8
INTERP 0x0000000000000238 0x0000000000400238 0x0000000000400238
0x000000000000001c 0x000000000000001c R 0x1
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
LOAD 0x0000000000000000 0x0000000000400000 0x0000000000400000
0x0000000000001d14 0x0000000000001d14 R E 0x200000
LOAD 0x0000000000001e10 0x0000000000601e10 0x0000000000601e10
0x000000000000022c 0x0000000000000230 RW 0x200000
DYNAMIC 0x0000000000001e28 0x0000000000601e28 0x0000000000601e28
0x00000000000001d0 0x00000000000001d0 RW 0x8
NOTE 0x0000000000000254 0x0000000000400254 0x0000000000400254
0x0000000000000044 0x0000000000000044 R 0x4
GNU_EH_FRAME 0x0000000000001bcc 0x0000000000401bcc 0x0000000000401bcc
0x000000000000003c 0x000000000000003c R 0x4
GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 RWE 0x10
GNU_RELRO 0x0000000000001e10 0x0000000000601e10 0x0000000000601e10
0x00000000000001f0 0x00000000000001f0 R 0x1
Section to Segment mapping:
Segment Sections...
00
01 .interp
02 .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .text .fini .rodata .eh_frame_hdr .eh_frame
03 .init_array .fini_array .jcr .dynamic .got .got.plt .data .bss
04 .dynamic
05 .note.ABI-tag .note.gnu.build-id
06 .eh_frame_hdr
07
08 .init_array .fini_array .jcr .dynamic .got
student@ubuntu18:~/Desktop/HW3$
我觉得你算错了
第一个 LOAD 段在地址 0x400000 处加载,大小为 0x1d14,因此它确实包括从 0x401bc0 开始的 10 个字节,偏移量 0x401bc0 - 0x400000 = 0x1bc0
进入该段。该段从文件中的偏移量 0 开始,因此您需要查看文件中的偏移量 0x1bc0
,而不是偏移量 0xbc0
。 0x1bc0
是十进制 7104
.
(而且 0xbc0
的十进制是 3008,而不是 4660。要记住心算的一个好事实是 0x1000 = 4096
是一页。所以 0x1bc0
必须在 4096 和8192,同样 0xbc0
必须小于 4096。这就是我一眼就能看出你的数学有问题的方式。)
编辑:仍然没有答案有效,输出是:
401bc0 3d2a323d 333a7b3d 3a3a =*2=3:{=::
我试过 =*2=3:{=:: 作为密码,但它是错误的(注意使用小端)
我不同意提供的答案,最重要的是不明白为什么我做错了,我正在检查 ELF 格式的可执行文件(来自 C)。
现在,我知道以下大小为 10 的字符数组包含一个秘密密码,我想找到它。
另外,我知道它位于地址 0x401bc0
。
char foor [10] = {0x??, 0x??, 0x??, 0x??, 0x??, 0x??, 0x??, 0x??, 0x??, 0x??, };
所以,我打开了 elf 文件,计算了 0xbc0 个字节(等于 4660)并开始写入我看到的前 10 个 (为什么我只计算了 0xbc0?因为根据我的第二个输出使用readelf 命令我看到 Load 部分在内存中从 0x400000 开始,它的偏移量在我的文件中是 0x0) ,我得到:
char foo[10] = {0xC3, 0x82, 0x66, 0xC6, 0x92, 0xC3, 0xB9, 0x03, 0x0F, 0xE2,};
但是错了,为什么?
我怎么知道,当我将这个字符数组转换为字符串并将其作为我程序的输入输入时,它说密码错误。
我的ELF文件(如果太长请见谅):https://justpaste.it/51sbe
另外我得到了这个:
readelf -l prog.html
Elf file type is EXEC (Executable file)
Entry point 0x4004fc
There are 9 program headers, starting at offset 64
Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
PHDR 0x0000000000000040 0x0000000000400040 0x0000000000400040
0x00000000000001f8 0x00000000000001f8 R E 0x8
INTERP 0x0000000000000238 0x0000000000400238 0x0000000000400238
0x000000000000001c 0x000000000000001c R 0x1
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
LOAD 0x0000000000000000 0x0000000000400000 0x0000000000400000
0x0000000000001d14 0x0000000000001d14 R E 0x200000
LOAD 0x0000000000001e10 0x0000000000601e10 0x0000000000601e10
0x000000000000022c 0x0000000000000230 RW 0x200000
DYNAMIC 0x0000000000001e28 0x0000000000601e28 0x0000000000601e28
0x00000000000001d0 0x00000000000001d0 RW 0x8
NOTE 0x0000000000000254 0x0000000000400254 0x0000000000400254
0x0000000000000044 0x0000000000000044 R 0x4
GNU_EH_FRAME 0x0000000000001bcc 0x0000000000401bcc 0x0000000000401bcc
0x000000000000003c 0x000000000000003c R 0x4
GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 RWE 0x10
GNU_RELRO 0x0000000000001e10 0x0000000000601e10 0x0000000000601e10
0x00000000000001f0 0x00000000000001f0 R 0x1
Section to Segment mapping:
Segment Sections...
00
01 .interp
02 .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .text .fini .rodata .eh_frame_hdr .eh_frame
03 .init_array .fini_array .jcr .dynamic .got .got.plt .data .bss
04 .dynamic
05 .note.ABI-tag .note.gnu.build-id
06 .eh_frame_hdr
07
08 .init_array .fini_array .jcr .dynamic .got
student@ubuntu18:~/Desktop/HW3$
我觉得你算错了
第一个 LOAD 段在地址 0x400000 处加载,大小为 0x1d14,因此它确实包括从 0x401bc0 开始的 10 个字节,偏移量 0x401bc0 - 0x400000 = 0x1bc0
进入该段。该段从文件中的偏移量 0 开始,因此您需要查看文件中的偏移量 0x1bc0
,而不是偏移量 0xbc0
。 0x1bc0
是十进制 7104
.
(而且 0xbc0
的十进制是 3008,而不是 4660。要记住心算的一个好事实是 0x1000 = 4096
是一页。所以 0x1bc0
必须在 4096 和8192,同样 0xbc0
必须小于 4096。这就是我一眼就能看出你的数学有问题的方式。)