我正在尝试使用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在输出末尾显示此内容:二进制文件?

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

评论

使用十六进制编辑器检查文件。它实际上是二进制文件还是其他文件,例如设置了Executable标志的bash脚本? sh_entsize数字实际上包含一个文本片段:/ lib64 / l –但不足以确定整个文件是什么。

二进制文件是使用GCC编译的C程序。编译后可能已更改。

您可以自由地将二进制文件发布到公共服务器上,以供其他人查看吗?

...是的...您找不到其他不需要登录/注册的服务器吗?无论我在哪里单击,都会弹出媒体播放器“更新” /在线赌场/等的弹出窗口。按钮“ DATEI HERUNTERLADEN”并没有真正实现应有的功能。

#1 楼

我无法在此处运行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


我有几点建议:


上面的“密码检查失败!”和“恭喜,密码检查成功!”消息,您将找到一个“ Axj54?_”字符串。您应该尝试使用它作为Crackme的解决方案。
由于有对“ 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;
}


并运行crackme,例如:

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


它应接受任何有效答案,但也应使用截获的参数之一向您显示真实答案。

评论


如果crackme足够复杂,足以更改可执行文件并杀死调试器(请参阅pkill字符串),但又愚蠢到足以将密码存储为纯字符串,我会感到惊讶。但是,尝试LD_PRELOAD是一个好主意。已投票。

–贡特拉姆·布洛姆(Guntram Blohm)
15年6月29日在9:47

谢谢你的建议。如果输入的长度> = 7,则strcmp会将用户输入与“ Axj54?_”进行比较。尽管这不是正确的密码,但strcmp和硬编码字符串可能只是出于混淆。

–lunfdxar
15年6月29日在11:13

#2 楼

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

,因此请尝试在x86_64版本下使用它,或尝试使用旨在替代它的LLDB调试器(lldb)。

请参见:gdb到lldb命令映射页面以获取更多信息。