使用 GDB 和反汇编调试二进制文件:无法识别文件格式(elf 标头已损坏)

逆向工程 拆卸 数据库
2021-07-08 12:42:16

我正在尝试使用 GDB 和 objdump 对二进制文件进行逆向工程。我可以在我的 linux shell 中执行二进制文件,但是文件似乎以无法调试/逆向工程的方式进行了更改。

file实用程序显示以下信息:

mybinary: ERROR: ELF 64-bit LSB executable, x86-64, invalid version (SYSV), dynamically linked (uses shared libs)error reading (Invalid argument)

我在 GDB 中收到以下错误:

gdb ./mybinary
mybinary: not in executable format: File format not recognized

以及来自 objdump 的类似错误:

objdump -S -l -C -F -t -w ./mybinary
objdump: ./mybinary: File format not recognized

readelf 在输出的末尾显示了这一点:

readelf -h ./mybinary
readelf: Error: Unable to seek to 0xffffff60e9000000 for string table
readelf: Error: Section 8 has invalid sh_entsize 6c2f343662696c2f (expected 18)
readelf: Error: Section 23 has invalid sh_entsize 0 (expected 10)
readelf: Error: no .dynamic section in the dynamic segment

我能做些什么来调试/逆向工程这个二进制文件?

编辑:gdb 和 objdump 显示这些错误消息,因为二进制文件的 elf 标头是故意损坏的。仍然不知道如何修复 elf 标头或调试此文件。

2个回答

我无法在这里运行crackme,但我确实在其上运行了“字符串”:

$ strings crackme
/lib64/ld-linux-x86-64.so.2
libc.so.6
srand
puts
time
clock
stdin
calloc
malloc
system
getline
strcmp
__libc_start_main
__gmon_start__
GLIBC_2.2.5
%z   
%r   
%j   
AWAVAUE1
ATE1
[]A\A]A^A_
t7"Hc
[]A\A]A^A_
$&463847345GeF387
pkill -f gdb > /dev/null 2>&1
pkill -f ddt > /dev/null 2>&1
pkill -f ddd > /dev/null 2>&1
Axj54?_
Password check failed!
Congratulations, password check successful!
;*3$"
GCC: (Ubuntu 4.8.2-19ubuntu1) 4.8.2
.shstrtab
.interp
.note.ABI-tag
.note.gnu.build-id
.gnu.hash
.dynsym
.dynstr
.gnu.version
.gnu.version_r
.rela.dyn
.rela.plt
.init
.text
.fini
.rodata
.eh_frame_hdr
.eh_frame
.init_array
.fini_array
.jcr
.dynamic
.got
.got.plt
.data
.bss
.comment

我有几个建议:

  1. 就在“密码检查失败!”的正上方。和“恭喜,密码检查成功!” 消息,你会发现一个“Axj54?_”字符串。您应该尝试将其作为破解版的解决方案。

  2. 由于有对“strcmp”的引用,您可以尝试使用 LD_PRELOAD 技巧将 strcmp() 替换为您自己的函数。这是一个示例代码,它将打印正在比较的字符串,并强制它们相等:

将此文件另存为“mystrcmp.c”:

#include <stdio.h>
int strcmp ( const char * str1, const char * str2 ) {
    printf("strcmp intercepted: str1=%s, str2=%s\n", str1, str2);
    return 0;
}

编译为:

$ gcc -shared -ldl mystrcmp.c -o mystrcmp.so

并运行crackme:

$ LD_PRELOAD=./mystrcmp.so ./crackme

它应该接受任何有效的答案,但它还应该在截获的参数之一中向您显示真正的答案。

可能是您的 GNU 调试器 ( gdb) 不支持 x86_64 架构。

因此,请尝试使用它的 x86_64 版本或尝试旨在替换它的LLDB Debugger ( lldb)。它可能可以更好地处理标题。

有关更多信息,请参阅:gdb 到 lldb 命令映射页面。