如果通常可以使用读取的 ELF 标头readelf
已被手动操作,假设通过增加“节标头的大小”的值,二进制文件仍然可以执行并且运行良好。
但是,这种操作似乎会绊倒 GDC 和 GDB 等逆向工程工具给我的错误:not in executable format: File format not recognized
.
有没有办法在不知道“节标题大小”的原始值的情况下修复 ELF 标题,以便能够再次使用标准工具分析文件?
详细信息:
GDB 无法运行二进制文件,因为它说文件是,not in executable format : File format not recognized
但它在 GDB 之外工作。libbfd
解析器也会发生同样的事情,它无法解析,因为无法识别文件格式。事实是我只更改了部分标题的数量。
代码
#include <stdio.h>
int main()
{
printf("Hello World!\n");
return 0;
}
通过调用make hello
或 在 64 位系统上构建make CFLAGS=-m32 hello
。
之前的 ELF 标头
$ readelf -h hello
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: Intel 80386
Version: 0x1
Entry point address: 0x8048320
Start of program headers: 52 (bytes into file)
Start of section headers: 4472 (bytes into file)
Flags: 0x0
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 9
Size of section headers: 40 (bytes)
Number of section headers: 30 <-- notice me!
Section header string table index: 27
后的 ELF 标头
$ readelf -h hello
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: Intel 80386
Version: 0x1
Entry point address: 0x8048320
Start of program headers: 52 (bytes into file)
Start of section headers: 4472 (bytes into file)
Flags: 0x0
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 9
Size of section headers: 40 (bytes)
Number of section headers: 52 <-- already changed!
Section header string table index: 27
GDB 将输出,
不是可执行格式:无法识别文件格式
但是如果我在 GDB 之外运行它,
$ ./hello output:
Hello World!
那么是否有一种方法可以在e_shnum
不知道正确值的情况下修复该值,或者有一种解决方法以便我可以在 GDB 中调试该文件?