是的你可以.但这并不容易.我会举个例子.
原文链接:https://www.f2er.com/bash/385087.html可以说我有以下程序叫做foo.c:
main() { *((char *) 0) = '\0'; }
我将编译它并确保没有符号:
$cc foo.c $strip a.out $file a.out a.out: ELF 32-bit LSB executable,Intel 80386,version 1 (SYSV),dynamically linked (uses shared libs),for GNU/Linux 2.6.15,stripped
好的,是时候运行了:
$./a.out Segmentation fault (core dumped)
哎呀.似乎有一个错误.让我们启动一个调试器:
$gdb ./a.out core [..] Reading symbols from /tmp/a.out...(no debugging symbols found)...done. [..] Core was generated by `./a.out'. Program terminated with signal 11,Segmentation fault. #0 0x0804839c in ?? () (gdb) bt #0 0x0804839c in ?? () #1 0xb7724e37 in __libc_start_main () from /lib/i386-linux-gnu/libc.so.6 #2 0x08048301 in ?? ()
嗯,看起来很糟糕.没有符号.我们能弄清楚发生了什么吗?
(gdb) x/i $eip => 0x804839c: movb $0x0,(%eax)
看起来它试图将值为零的字节存储到EAX寄存器指向的内存位置.为什么会失败?
(gdb) p $eax $1 = 0 (gdb)
它失败了,因为EAX寄存器指向一个内存地址为零,它试图在该地址存储一个字节.哎呀!
不幸的是,我没有指向任何好教程的指针.搜索“gdb逆向工程”会给出一些可能有用的零碎的链接.
更新:
我注意到这是关于调试客户的核心转储的评论.将剥离的二进制文件发送给客户时,应始终保留该二进制文件的调试版本.
我建议不要剥离甚至提供源代码.我写的所有代码都带有源代码的客户.我一直在客户方面面对一个不称职的供应商,该供应商已经发布了一个破碎的软件,但不知道如何解决它.太糟糕了.
这似乎实际上是这个问题的重复:
Debug core file with no symbols
那里还有一些额外的信息.