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

标签 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

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

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

是否缺少一些依赖项?

最佳答案

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

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

qemu-arm  /mnt/bin/echo hello

我收到类似的错误:

/lib/ld-linux-armhf.so.3: No such file or directory

我可以提供动态链接器的显式路径,如下所示:

qemu-arm  /mnt/lib/ld-linux-armhf.so.3 /mnt/bin/echo hello

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

/mnt/bin/echo: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory

这实际上很棒,因为这是一个正常的“我找不到我的共享库”错误,解决方案是使用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

这让我得到输出:

hello

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

关于c - qemu-arm 运行已编译的二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47619120/

相关文章:

c - 如何在 C 语言中跳过/忽略循环内的特定位置(列表上)?

c - ARM ASM : Bad Instruction end

c - 是否可以在单字节对齐结构中对齐特定结构成员?

android - APK文件如何包含DLL文件? Android可以运行DLL文件吗?

android - 使用HTTP Toolkit检查Android手游网络流量时出现连接错误

c# - 是否可以动态修补 dotnet 函数

c - 不了解C中static int的功能

c - 如何更改键盘布局(X11 API 解决方案)

c# - 更改扩展 Controller 中 ViewData 的类型

assembly - 错误 : A1163E Unknown Opcode R0, 期望操作码或宏指令位于左列