二进制文件中是否有对源文件的引用?我尝试在二进制文件上运行字符串,但找不到对列出的源文件的任何引用...
如何找出程序或其他库使用共享对象的哪些功能?在这种特定情况下,我想看看/lib/libgcc1_s.so.1中的哪些函数被其他动态库使用.由于它们是动态链接的,因此objdump -d不会解析函数调用地址.有没有办法在调试器中运行程序或静态重新链接?谢谢,
卢卡
编辑:
nm和readelf不会这样做,我不需要查看共享对象中存在哪些符号,但实际上在链接到它的其他对象中使用了哪些符号.
我正在尝试执行一个非常简单的缓冲区溢出攻击.我几乎是新手.所以,如果这个问题很愚蠢,请原谅:-)
代码:
#include<stdio.h>
#include<stdlib.h>
int i, n;
void confused(int i)
{
printf("**Who called me? Why am I here?? *** %x\n ", i);
}
void shell_call(char *c)
{
printf(" ***Now calling \"%s\" shell command *** \n", c);
system(c);
}
void victim_func()
{
int a[4];
printf("Enter n: "); scanf("%d",&n);
printf("~~~~~~~~~~~~~ values and address of n locations ~~~~~~~~~~");
for (i = 0;i <n ;i++)
printf ("\n a[%d] = %x, address = %x", i, a[i], &a[i]);
printf("\nEnter %d HEX Values \n", n);
// Buffer …Run Code Online (Sandbox Code Playgroud) 我正在运行这两个命令,我得到不同的输出:
$ ldd `which ls`
linux-gate.so.1 => (0x00db3000)
libselinux.so.1 => /lib/i386-linux-gnu/libselinux.so.1 (0x00ba2000)
librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0x007bf000)
libacl.so.1 => /lib/i386-linux-gnu/libacl.so.1 (0x004ce000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00110000)
libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0x00398000)
/lib/ld-linux.so.2 (0x00dea000)
libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0x00a83000)
libattr.so.1 => /lib/i386-linux-gnu/libattr.so.1 (0x00d3d000)
Run Code Online (Sandbox Code Playgroud)
然后
objdump -x `which ls` | grep NEEDED
NEEDED libselinux.so.1
NEEDED librt.so.1
NEEDED libacl.so.1
NEEDED libc.so.6
Run Code Online (Sandbox Code Playgroud)
那是怎么回事?我以为他们都给了库依赖?我关心的原因是我怀疑ldd是正确的,但我正在使用ARM上的linux,那里没有我能说的ldd ......
我在linux中有一个文件夹,它包含几个共享对象文件(*.so).如何在linux中使用objdump和bash函数在共享对象文件中找到函数?
例如,以下示例func1在mylib.so中找到我的函数:
objdump -d mylib.so | grep func1
Run Code Online (Sandbox Code Playgroud)
但我想找到func1包含共享对象文件的文件夹.我不知道bash语言以及如何组合linux终端命令.
在现代linux中,几乎所有对象都被剥离并分成两部分(两个文件).第一个是可执行的,第二个是调试符号,从原始ELF中删除.这样的文件是用
objcopy --only-keep-debug original.elf binary.dbg
mv original.elf binary
objcopy --strip-debug binary
Run Code Online (Sandbox Code Playgroud)
我该如何合并binary和binary.dbg成ELF文件,调试信息?我想重新创建未经剥离的原始二进制文件.它可以不是与原始字节相同的字节到字节,但必须在其中包含调试符号.
PS是的,我知道gnu.debuglink部分,但它不适用于某些调试器(etnus)和反汇编程序(objdump无法恢复符号信息)
我有一个C++对象文件,其中包含一些C++模板函数的实例.有问题的目标文件为模板参数的几种不同组合实例化相同的功能.我正在尝试调试一个问题,并希望查看模板函数的特定实例化的反汇编(也就是说,我知道我想要检查的函数的模板参数).我通常会这样做objdump来反汇编目标文件,但它(至少在默认情况下)不能解析C++函数名称.有没有办法做到这一点?目标文件是使用gcc 4.6.1创建的.
每次我做一个objdump -d我总是看到asm代码与批量的nop指令(指令什么都不做)
例如,采取相同的程序:
#include <stdio.h>
#include <math.h>
int main()
{
printf("Hello World!\n");
printf("cos: %f\n", cos(1));
return 1;
}
Run Code Online (Sandbox Code Playgroud)
示例的objdump在入口点的末尾有2个nops
0000000000400450 <_start>:
400450: 31 ed xor %ebp,%ebp
400452: 49 89 d1 mov %rdx,%r9
400455: 5e pop %rsi
400456: 48 89 e2 mov %rsp,%rdx
400459: 48 83 e4 f0 and $0xfffffffffffffff0,%rsp
40045d: 50 push %rax
40045e: 54 push %rsp
40045f: 49 c7 c0 00 06 40 00 mov $0x400600,%r8
400466: 48 c7 c1 70 05 40 00 mov $0x400570,%rcx
40046d: 48 c7 …Run Code Online (Sandbox Code Playgroud) 我需要在我的应用程序中使用objdump和readelf命令在Windows上运行.我知道我可以安装cygwin以便使用它们.我之所以不想使用cygwin是因为我想让它的文章部署.另外我不知道如何安装cygwin.因此,我认为我需要的是GNU Utilities For Win32,因为链接声明这些库是无服务器的."可执行文件仅依赖于Microsoft C-runtime(msvcrt.dll),而不依赖于Cygwin工具提供的仿真层"
无论如何,一旦我去那个链接,我不知道如何安装它.具体来说,我想使用>这个工具<
如果有人可以指出我将如何在我的应用程序中使用objdump和readelf(binutils in cygwin),我将不胜感激.
寻找在我的二进制文件(准确地说.so)中查看特定函数的生成汇编程序的方法,就像我在Compiler Explorer上看到类似的那样,我发现了How to disassemble one single function using objdump? 并根据那里的答案(以及我的进一步搜索)我最终使用了以下命令:
objdump --wide --no-address --no-show-raw-insn [--demangle] --disassemble="<symbol>" -- "<binary>"
Run Code Online (Sandbox Code Playgroud)
<symbol>我发现使用的地方:
objdump --syms [--demangle] -- "<binary>" | grep <function>
Run Code Online (Sandbox Code Playgroud)
其中,the 又<function>是我感兴趣的 C++ 函数名称。当然,the<symbol>是一个损坏的名称。(为了完整起见,我得到了两个结果 - 一个是预期的结果,另一个是带.cold后缀的结果,由“主结果”使用。)
结果已经很扎实了。然而,浏览objdump选项后我看到了有希望的选项:
-C/ --demangle,-l/ --line-numbers,-S/ --source。但是,我无法让他们工作......
INITIAL:第一个 ( -C/ --demangle) 导致根本不打印任何反汇编代码。如果没有它,在该Disassembly of section .text:行之后我会有一行带有符号的行,后跟反汇编。使用此选项时,不会显示符号和反汇编,而是Disassembly of section .fini: …