---
# System prepended metadata

title: Firmadyne 改 Kernel
tags: [Linux, firmadyne]

---

Firmadyne 改 Kernel
===
---

###### tags: `firmadyne` `Linux`
這篇紀錄將 mipsel 架構的 kernel 重編的過程，改寫一小段 log 寫法，並且查看 log 的改變

---

# Cross-compiler
首先要準備 Cross-compiler
雖然 Firmadyne Readme 中的 Compiling from Source 章節
有寫說如何自己用 GregorR/musl-cross 來 build cross-compiler
但我照著做，build不出來
只好直接載 Firmadyne 作者群已經 build 好的版本

![](https://i.imgur.com/WV7WbDe.png)
中間有個
> click here to download our pre-built toolchains.

![](https://i.imgur.com/UaZDuH2.png)
下載 mipsel-linux-musl.tar.xz

存到目錄 /opt/cross
執行以下指令
```
cd /opt/cross

sudo tar -xvf mipsel-linux-musl.tar.xz
# 此時，應該會產生 mipsel-linux-musl 目錄

cd mipsel-linux-musl/bin

# 根據 Firmadyne kernel-v2.6.32.git 的 Makefile
# 是使用 mipsel-linux-musl/bin/mipsel-linux-musl-gcc
# 這個目錄底下最像的東西就是 mipsel-linux-musl-gcc-5.3.0 了
# 直接改名 TryTry 看
mv mipsel-linux-musl-gcc-5.3.0 mipsel-linux-musl-gcc

# 在實際 Make 時，跳出 log:
# error while loading shared libraries: libmpfr.so.4: cannot open shared object file: No such file or directory
# 以下是 Google 後的解方，看來只是 link 到已經有的 libmpfr.so.6
sudo ln -s /usr/lib/x86_64-linux-gnu/libmpfr.so.6 /usr/lib/x86_64-linux-gnu/libmpfr.so.4
```

# Source Code Editing
我是改 driver/firmadyne/hooks.c 
![](https://i.imgur.com/eC1VWYB.png)
主要是在 Line 306 加了
```c=
printk(KERN_INFO MODULE_NAME": called from %pS\n", (void *)__builtin_return_address(0));
```
試圖查看 caller function

# Build Kernel
參考 Firmadyne Readme
```
# 下載 Firmadyne kernel-v2.6.32，並進入此 git 目錄
git clone https://github.com/firmadyne/kernel-v2.6.32.git && cd kernel-v2.6.32

# 創 build 目錄
mkdir -p build/mipsel

# 複製設定檔
cp config.mipsel build/mipsel/.config

# 實際 Build Kernel
make ARCH=mips CROSS_COMPILE=/opt/cross/mipsel-linux-musl/bin/mipsel-linux-musl- O=./build/mipsel -j8

# 將 Build 好的 Kernel: vmlinux
# 放到 firmadyne/binaries/vmlinux.mipsel
# 也就是實際 qemu 跑的 kernel
cp build/mipsel/vmlinux ../firmadyne/binaries/vmlinux.mipsel
```

# 檢查 log
![](https://i.imgur.com/PIdjgxh.png)
接下來跑的樣本
filename 為 `DAP-1520_REVA_FIRMWARE_1.05.B02.ZIP`
arch 確定為 mipsel
且之前跑這個樣本時，已經確定會跳出 `__inet_insert_ifa` 相關的 log
表示等等應該會執行到上一 Part 新加的 Code

跑一下
```
./scripts/inferNetwork.sh 4
```

在 qemu.initial.serial.log 中，有 `__inet_insert_ifa` 的 log 後面都有跟剛剛新加的 Code，到此為止可確定有改成功
```
[    2.544000] firmadyne: __inet_insert_ifa[PID: 73 (rc)]: device:br0 ifa:0x3200a8c0
[    2.544000] firmadyne: called from devinet_ioctl+0x3a4/0x7a0
```

![](https://i.imgur.com/IvRGw7v.png)




