【问题标题】:Linux Binutils using 'as' to assemble MipsLinux Binutils 使用 'as' 组装 Mips
【发布时间】:2015-08-12 13:40:24
【问题描述】:

我已经提取了我正在尝试进行逆向工程的 D-Link 固件。

我以前没有任何使用 Mips 的经验。我已经下载了 Mars 来学习 Mips。但现在我有点了解 Mips,我想构建机器代码。我可以将它作为垃圾场从火星导出,radare2 可以很好地拆卸它,但我更喜欢终端实用程序。

我听说as 可以做到这一点,但是在-march 下没有针对 mips32、mips1、mips2 等的选项。

我已经浏览了 Google 以了解为什么会这样,但到目前为止还没有成功。有人可以让我正确启用as 中的这些功能吗?

非常感谢您的帮助。

【问题讨论】:

  • 你可能需要 multiarch-binutils。
  • cross-compile binutils 相当简单(相对于完整的交叉编译器工具链)。您只需要指定 ABI:--target=mips 可能就足够了。 MIPS options
  • 您还可以在 MIPS VM 中使用本机 MIPS binutils。这里是 MIPS qemu 的一个示例:unix.stackexchange.com/a/163242/9275
  • binutils-multiarch 没有帮助,不幸的是,我可能不得不从源代码编译 binutils,比如 ./configure --target=mips 或类似的东西?
  • ./configure 下载最新的 binutils 后执行 ./configure --help | 不会产生任何结果grep mips 和 ./configure --help | grep 拱门。似乎没有任何真正好的例子来说明如何做到这一点。正如布雷特发布的那样,我已经看到了 binutils 的 mips 选项,但是当我使用 --help 时,即使在安装 binutils-multiarch 之后仍然没有 mips 选项。是否没有任何关于这方面的好信息似乎很奇怪。如今,Mips 在嵌入式设备中相当普遍。猜猜我被困在火星 GUI 中了吗?这不好玩,哈哈

标签: linux assembly mips reverse-engineering gnu-assembler


【解决方案1】:

我在头疼之后找到了一个解决方案,但是这对于那些希望在 linux 上快速学习 mips 的人来说非常有用。

test.asm:

.text
main:
li $t1, 100
li $t2, 50
add $t3, $t1, $t2
li $t4, 25

使用您的 asm 文件执行以下操作,通过安装 spim 将其组装成机器代码,奇怪的是 mips 向后拼写:

apt-get update
apt-get install spim
spim
(spim) load "test.asm"
(spim) dumpnative "test.bin"

这将为您转储带有机器代码的 bin 文件。是的,您需要在文件名周围加上引号,否则 spim 会出错。

要反汇编您的代码,请执行以下操作:

apt-get update
apt-get install radare2
radare2 -a mips test.bin
[0x00000000]>b 32
[0x00000000]>aa
[0x00000000]>af
[0x00000000]>pd

虽然这是使用 qemu 执行此操作的一种快速方法,并且比 spim 准确得多:

首先下载 DTChere。 *注意:必须这样做的原因是因为 qemu 的设置方式仅在 DTC 文件夹中包含的文件夹中查找 DTC,该文件夹包含在 /usr/lib 或 /usr/include 等之外的源文件中。

让我们开始编译 qemu:

apt-get update
apt-get -y install git build-essential
git clone git://git.qemu-project.org/qemu.git
tar -xzvf dtc-1760e7c.tar.gz
cd dtc-1760e7c
cp * ../qemu/dtc
cp -r Documentation/ ../qemu/dtc
cp -r libfdt/ ../qemu/dtc
cp -r scripts/ ../qemu/dtc
cp -r tests/ ../qemu/dtc
cd ..
cd qemu/dtc
make
cd ..
./configure
make
make install

安装完 qemu 之后,让我们创建一个 qemu 可以使用的虚拟机,它将是 Debian Squeeze 的 mips 版本。

首先让我们获取所需的文件:

wget http://ftp.de.debian.org/debian/dists/squeeze/main/installer-mips/current/images/malta/netboot/initrd.gz
wget http://ftp.de.debian.org/debian/dists/squeeze/main/installer-mips/current/images/malta/netboot/vmlinux-2.6.32-5-4kc-malta

现在为 qemu 创建虚拟驱动器:

qemu-img create -f qcow2 debian_mips.qcow2 2G

运行安装程序:

qemu-system-mips -hda debian_mips.qcow2 -kernel vmlinux-2.6.32-5-4kc-malta -initrd initrd.gz -append "root=/dev/ram console=ttyS0" -nographic

按照所有提示进行安装。

要启动到运行模拟 mips 的 Debian Squeeze,请执行以下操作:

qemu-system-mips -hda debian_mips.qcow2 -kernel vmlinux-2.6.32-5-4kc-malta -append "root=/dev/sda1 console=ttyS0" -nographic

在这里使用您在安装过程中设置的凭据登录并执行以下操作以设置 ssh 以方便使用:

apt-get update
apt-get -y install ssh

关闭这个 qemu 实例并使用以下命令启动另一个:

qemu-system-mips -hda debian_mips.qcow2 -kernel vmlinux-2.6.32-5-4kc-malta -append "root=/dev/sda1 console=ttyS0" -nographic -redir tcp:10022::22

在主机上执行以下操作连接到 ssh:

ssh -p 10022 localhost

现在一旦登录,让我们现在安装我们需要做 mips 组装的东西:

apt-get update
apt-get -y install build-essential gdb

现在让我们写一个简单的mips asm文件将它汇编和反汇编并比较代码。

nano test.asm

--start test.asm--
.global __start
.text
__start:
li $t0, 100
li $t1, 50
add $t2, $t0, $t1
--end test.asm--

CTRL + O, CTRL + X

as -march=mips32 -o test.o test.asm
objdump -d test.o

--start objdump output--
0:  24080064    li  t0,100
   4:   24090032    li  t1,50
   8:   01095020    add t2,t0,t1
   c:   00000000    nop
--end objdump output--

您可以看到我们确实以这种方式获得了确切的命令,而 spim 有时不匹配。

您的反汇编器会对其进行最佳解释并输出汇编指令,根据反编译器,某些指令可能看起来并不完全相同,但它对大多数指令都非常有效,并且应该仍然有效。

这很棒的原因是您不必打开火星来执行此操作。 Mars 是一个很好的工具,可以模拟获取 mips 的机器代码,但 spim 和 qemu 肯定是轻量级的,并为您将其保存在终端中。我希望这对其他人也有帮助。

--lillypad

【讨论】:

    猜你喜欢
    • 2012-03-04
    • 2012-06-18
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多