日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

通过QEMU 和 IDA Pro远程调试设备固件

發(fā)布時(shí)間:2025/3/15 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 通过QEMU 和 IDA Pro远程调试设备固件 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

0x00 背景與簡(jiǎn)介


這篇文章主要講了如何在模擬環(huán)境下調(diào)試設(shè)備固件。

作者:Zach Cutlip

原文鏈接:http://shadow-file.blogspot.gr/2015/01/dynamically-analyzing-wifi-routers-upnp.html。

在分析嵌入式設(shè)備的固件時(shí),只采用靜態(tài)分析方式通常是不夠的。你需要實(shí)際執(zhí)行你的分析目標(biāo)來(lái)觀察它的行為。在嵌入式Linux設(shè)備的世界里,很容易把一個(gè)調(diào)試器放在目標(biāo)硬件上進(jìn)行調(diào)試。如果你能在自己的系統(tǒng)上運(yùn)行二進(jìn)制文件,而不是拖著硬件做分析, 將會(huì)方便很多。這就需要用QEMU進(jìn)行仿真。

接下來(lái)的一系列文章,我將專(zhuān)注于Netgear的一個(gè)比較流行的無(wú)線路由器,對(duì)其UPnP守護(hù)進(jìn)程進(jìn)行逆向分析。這篇文章將介紹如何在系統(tǒng)仿真環(huán)境下運(yùn)行守護(hù)進(jìn)程,以便可以通過(guò)調(diào)試器對(duì)其進(jìn)行分析。

0x01 先決條件


首先,建議你讀一下我的工作區(qū)以及所使用的工具的描述。這里是鏈接http://shadow-file.blogspot.com/2013/12/emulating-and-debugging-workspace.html。

你需要一個(gè)MIPS Linux的模擬環(huán)境。對(duì)于這一點(diǎn),建議讀者查看我之前的搭建QEMU的帖子。http://shadow-file.blogspot.com/2013/05/running-debian-mips-linux-in-qemu.html

你還需要一個(gè)MIPS Linux的交叉編譯器。我不會(huì)詳細(xì)描述交叉編譯器的建立過(guò)程,因?yàn)樗鼈円粓F(tuán)糟。有時(shí)候,你需要較舊的工具鏈,而其他時(shí)候,你需要較新的工具鏈。最好使用uClibc buildroot project(http://buildroot.uclibc.org/)同時(shí)建立big endian和little endian的MIPS Linux工具鏈。除此之外,每當(dāng)我發(fā)現(xiàn)其他交叉編譯工具鏈時(shí),我都會(huì)保存他們。類(lèi)似D-Link和Netgear公司發(fā)布GPL版本tarballs是舊工具鏈的好來(lái)源。

一旦你有了目標(biāo)架構(gòu)的交叉編譯工具鏈,你需要為目標(biāo)建立GDB調(diào)試器。你至少需要適合目標(biāo)架構(gòu)的被靜態(tài)編譯的gdbserver。如果要使用GDB進(jìn)行遠(yuǎn)程調(diào)試,你需要編譯GDB,以便在你的本地機(jī)器架構(gòu)(如X86-64)上運(yùn)行,來(lái)對(duì)目標(biāo)架構(gòu)(如MIPS或mipsel體系結(jié)構(gòu))進(jìn)行調(diào)試。同樣,我也不會(huì)去討論這些工具的構(gòu)建,如果你建立了你的工具鏈,這應(yīng)該很容易了。

后面我將描述如何使用IDA Pro來(lái)進(jìn)行遠(yuǎn)程調(diào)試。但是,如果你想使用gdb,可以看看我的MIPS gdbinit文件:https://github.com/zcutlip/gdbinit-mips

0x02 模擬一個(gè)簡(jiǎn)單的二進(jìn)制


假設(shè)你已經(jīng)建立了上述工具,并能正常工作,你現(xiàn)在應(yīng)該能夠通過(guò)SSH進(jìn)入您的模擬MIPS系統(tǒng)。正如我在Debian MIPS QEMU文章中所述,我喜歡連接QEMU的接口到VMWare的NAT接口,這樣就能夠用我的Mac通過(guò)SSH來(lái)接入,而不需要先登陸我的Ubuntu虛擬機(jī)。這也可以讓我通過(guò)NFS將我的Mac工作區(qū)掛載到QEMU系統(tǒng)。這樣,無(wú)論我工作在主機(jī)環(huán)境中,或是Ubuntu中,還是在QEMU中,我都在用相同的工作區(qū)。

zach@malastare:~ (130) $ ssh root@192.168.127.141 root@192.168.127.141's password: Linux debian-mipsel 2.6.32-5-4kc-malta #1 Wed Jan 12 06:13:27 UTC 2011 mipsroot@debian-mipsel:~# mount /dev/sda1 on / type ext3 (rw,errors=remount-ro) malastare:/Users/share/code on /root/code type nfs (rw,addr=192.168.127.1) root@debian-mipsel:~#cd code root@debian-mipsel:~/code#

一旦登陸到模擬系統(tǒng),cd到從設(shè)備的固件中提取的文件系統(tǒng)中。你應(yīng)該能夠chroot到固件的根文件系統(tǒng)。需要使用chroot,因?yàn)槟繕?biāo)二進(jìn)制是和固件的庫(kù)鏈接的,很可能不能跟Debian的共享庫(kù)一起工作。

root@debian-mipsel:~#cd code/wifi-reversing/netgear/r6200/extracted-1.0.0.28/rootfs/ root@debian-mipsel:~/code/wifi-reversing/netgear/r6200/extracted-1.0.0.28/rootfs#file ./bin/ls ./bin/ls: symbolic link to `busybox' root@debian-mipsel:~/code/wifi-reversing/netgear/r6200/extracted-1.0.0.28/rootfs#file ./bin/busybox ./bin/busybox: ELF 32-bit LSB executable, MIPS, MIPS32 version 1 (SYSV), dynamically linked (uses shared libs), stripped root@debian-mipsel:~/code/wifi-reversing/netgear/r6200/extracted-1.0.0.28/rootfs#chroot . /bin/ls -l /bin/busybox -rwxr-xr-x 1 10001 80 276413 Sep 20 2012 /bin/busybox root@debian-mipsel:~/code/wifi-reversing/netgear/r6200/extracted-1.0.0.28/rootfs#

在上面的例子中,我已切換到所提取的文件系統(tǒng)的根目錄中。然后使用file命令,我了解到busybox是little endian MIPS可執(zhí)行文件。然后,chroot到提取根目錄,并運(yùn)行bin/ls,它是busybox的符號(hào)鏈接。

如果試圖簡(jiǎn)單的通過(guò)“chroot .”來(lái)地啟動(dòng)一個(gè)shell,將無(wú)法正常工作。因?yàn)槟愕哪J(rèn)shell是bash,而大多數(shù)嵌入式設(shè)備沒(méi)有bash。

root@debian-mipsel:~/code/wifi-reversing/netgear/r6200/extracted-1.0.0.28/rootfs#chroot . chroot: failed to run command `/bin/bash': No such file or directory root@debian-mipsel:~/code/wifi-reversing/netgear/r6200/extracted-1.0.0.28/rootfs#

相反,你可以chroot并執(zhí)行bin / sh:

root@debian-mipsel:~/code/wifi-reversing/netgear/r6200/extracted-1.0.0.28/rootfs#chroot . /bin/shBusyBox v1.7.2 (2012-09-20 10:26:08 CST) built-in shell (ash) Enter 'help' for a list of built-in commands.# # #exit root@debian-mipsel:~/code/wifi-reversing/netgear/r6200/extracted-1.0.0.28/rootfs#

0x03 硬件解決方法


即使有了必要的工具,建立了仿真環(huán)境且工作正常,你仍然可能遇到障礙。雖然QEMU在模擬核心芯片組包括CPU上都做的很不錯(cuò),但是QEMU往往不能提供你想運(yùn)行的二進(jìn)制程序需要的硬件。如果你試圖模仿一些簡(jiǎn)單的像/bin/ls的程序,通常能夠正常工作。但更復(fù)雜的東西,如肯定有特定的硬件依賴的UPnP守護(hù)程序,QEMU就不能夠滿足。尤其對(duì)于管理嵌入式系統(tǒng)硬件的程序更是這樣,例如打開(kāi)或關(guān)閉無(wú)線適配器。

你將遇到的最常見(jiàn)問(wèn)題是在運(yùn)行系統(tǒng)服務(wù),如Web服務(wù)器或UPnP守護(hù)進(jìn)程時(shí),缺乏NVRAM。非易失性RAM通常是包含配置參數(shù)的設(shè)備快速存儲(chǔ)器的一個(gè)分區(qū)。當(dāng)一個(gè)守護(hù)進(jìn)程啟動(dòng)時(shí),它通常會(huì)嘗試查詢NVRAM,獲取其運(yùn)行時(shí)配置信息。有時(shí)一個(gè)守護(hù)進(jìn)程會(huì)查詢NVRAM的幾十甚至上百個(gè)參數(shù)。

為了解決在模擬條件下缺乏NVRAM的問(wèn)題,我寫(xiě)了一個(gè)叫nvram-faker的庫(kù)。當(dāng)你運(yùn)行二進(jìn)制程序時(shí),應(yīng)該使用LD_PRELOAD對(duì)nvram-faker庫(kù)進(jìn)行預(yù)加載。它會(huì)攔截通常由libnvram.so提供的nvram_get()調(diào)用。nvram-faker會(huì)查詢你提供的一個(gè)INI風(fēng)格的配置文件,而不是試圖查詢NVRAM。

附帶的README提供更完整的說(shuō)明。這里有一個(gè)鏈接:https://github.com/zcutlip/nvram-faker

即使解決了NVRAM問(wèn)題,該程序可能會(huì)假設(shè)某些硬件是存在的。如果硬件不存在,該程序可能無(wú)法運(yùn)行,或者即便它運(yùn)行了,行為可能也與在其目標(biāo)硬件上運(yùn)行時(shí)有所不同。在這種情況下,你可能需要修補(bǔ)二進(jìn)制文件。采用二進(jìn)制補(bǔ)丁的情況各不相同。這取決于期望什么硬件,以及它不存在時(shí)的行為是什么。如果硬件缺失,你可能需要修補(bǔ)一個(gè)被執(zhí)行到的條件分支。也可能需要修補(bǔ)針對(duì)特殊設(shè)備的ioctl()調(diào)用,如果你想將其替代為針對(duì)常規(guī)文件的讀取和寫(xiě)入時(shí)。這里我將不談?wù)撔扪a(bǔ)的細(xì)節(jié),但在我的BT HomeHub文章以及44CON的相應(yīng)講座中進(jìn)行了討論。

這里是這些資源的鏈接:http://shadow-file.blogspot.com/2013/09/44con-resources.html

0x04 附加調(diào)試器


一旦在QEMU中運(yùn)行了二進(jìn)制程序,就可以附加調(diào)試器了。當(dāng)然你需要gdbserver。同樣,這個(gè)工具應(yīng)該適合目標(biāo)架構(gòu)并被靜態(tài)編譯,因?yàn)槟銜?huì)在chroot下運(yùn)行它。你需要將它復(fù)制到提取的文件系統(tǒng)的根目錄中。

# ./gdbserver Usage: gdbserver [OPTIONS] COMM PROG [ARGS ...] gdbserver [OPTIONS] --attach COMM PID gdbserver [OPTIONS] --multi COMMCOMM may either be a tty device (for serial debugging), or HOST:PORT to listen for a TCP connection.Options:--debug Enable general debugging output. --remote-debug Enable remote protocol debugging output. --version Display version information and exit.--wrapperWRAPPER -- Run WRAPPER to start new programs.--once Exit after the first connection has closed. #

你可以將gdbserver附加到正在運(yùn)行的進(jìn)程,或者用它來(lái)直接執(zhí)行二進(jìn)制程序。如果你需要調(diào)試只發(fā)生一次的初始化程序,你可以選擇后者。

另一方面,你可能要等到守護(hù)進(jìn)程被創(chuàng)建。據(jù)我所知沒(méi)有辦法讓IDA跟蹤創(chuàng)建的進(jìn)程(forked processes)。你需要單獨(dú)的附加到它們。如果采用這種方式,你可以在chroot外,附加到已經(jīng)運(yùn)行的進(jìn)程。

以下shell腳本將在chroot下執(zhí)行upnpd。如果DEBUG設(shè)置為1,它會(huì)附加在upnpd上,并在1234端口上暫停等待遠(yuǎn)程調(diào)試會(huì)話。

1 2 3 4 5 6 7 8 9 10 11 ROOTFS="/root/code/wifi-reversing/netgear/r6200/extracted-1.0.0.28/rootfs" chroot$ROOTFS /bin/sh -c "LD_PRELOAD=/libnvram-faker.so /usr/sbin/upnpd" #Give upnpd a bit to initialize and fork into the background. sleep 3; if [ "x1" = "x$DEBUG" ]; then $ROOTFS/gdbserver --attach 0.0.0.0:1234 $(pgrepupnpd) fi

你可以在recvfrom()調(diào)用之前創(chuàng)建一個(gè)斷點(diǎn),然后當(dāng)你向upnpd發(fā)送M-SEARCH包時(shí),驗(yàn)證調(diào)試器斷點(diǎn)。

然后,在IDA的Debugger菜單中的Process選項(xiàng)中設(shè)置“主機(jī)名”為你的QEMU系統(tǒng)的IP地址,并設(shè)置端口為gdbserver正在監(jiān)聽(tīng)的端口。我用的是1234。

接受設(shè)置,然后通過(guò)IDA的CTRL+8熱鍵連接到遠(yuǎn)程調(diào)試會(huì)話。再次按Ctrl+8繼續(xù)執(zhí)行。你應(yīng)該能夠發(fā)送一個(gè)M-SEARCH包1,可以看到調(diào)試器命中斷點(diǎn)。

顯然還有很多需要探索,也會(huì)遇到有很多這里未提及的情況,但希望這可以讓你開(kāi)始。

我推薦Craig Heffner用于UPnP分析的miranda工具:https://code.google.com/p/miranda-upnp/


原文地址: http://drops.wooyun.org/tips/4523

總結(jié)

以上是生活随笔為你收集整理的通过QEMU 和 IDA Pro远程调试设备固件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。