qemu-arm 运行编译后的二进制文件

Jac*_*ack 4 c arm reverse-engineering qemu firmware

尝试运行我从 qemu 上的固件中提取的已编译二进制文件,但是我遇到了这个错误:

root@ubuntu14:~# qemu-arm -L /usr/arm-linux-gnueabi ~/x
/system/bin/linker: No such file or directory

root@ubuntu14:~# file ./x
./x: ELF 32-bit LSB  shared object, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), stripped
Run Code Online (Sandbox Code Playgroud)

我正在使用“-L”标志,如建议的: qemu-arm can't run arm compiler binary

但是,这个标志对我来说似乎没有什么不同,设置 QEMU_LD_PREFIX 也没有

可能是缺少一些依赖项吗?

lar*_*sks 6

看起来系统无法找到动态链接器(在您的情况下似乎是/system/bin/linker,而不是正常的/lib/ld-linux-armhf.so.3或类似的。

由于我无法访问您的代码,因此我尝试通过/mnt在我的系统上安装 Raspberry Pi“Raspbian”映像来重现此问题。如果我尝试运行/mnt/bin/echo hello,就像这样:

qemu-arm  /mnt/bin/echo hello
Run Code Online (Sandbox Code Playgroud)

我收到类似的错误:

/lib/ld-linux-armhf.so.3: No such file or directory
Run Code Online (Sandbox Code Playgroud)

我可以像这样提供动态链接器的显式路径:

qemu-arm  /mnt/lib/ld-linux-armhf.so.3 /mnt/bin/echo hello
Run Code Online (Sandbox Code Playgroud)

现在我得到一个不同的错误:

/mnt/bin/echo: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)

这实际上很棒,因为这是一个正常的“我找不到我的共享库”错误,解决方案是使用LD_LIBRARY_PATH. 我们可以在使用以下标志创建的环境中设置它,而不是在我们的环境中设置它:qemu-arm-E

qemu-arm -E LD_LIBRARY_PATH=/mnt/lib/arm-linux-gnueabihf/  /mnt/lib/ld-linux-armhf.so.3 /mnt/bin/echo hello
Run Code Online (Sandbox Code Playgroud)

这让我得到了输出:

hello
Run Code Online (Sandbox Code Playgroud)

我怀疑这两种相同的技术——提供链接器的显式路径,并提供显式的库搜索路径LD_LIBRARY_PATH——可能会帮助你。让我知道它是如何工作的!