.bin檔案的反彙編記錄
前言
原本打算把IDA的使用與技巧寫完,發現其實網上也有很多,這就以後再議吧(主要還是懶+拖延症吧…)
工作需要接觸的逆向,從開始到現在做的一直是elf格式檔案,也不需要脫殼,感覺也比較簡單。
前兩天朋友託幫忙看一個.bin,發現自己現在掌握的其實僅僅冰山一角。將此次工作記錄,便於日後學習查閱。
一、 一些相關知識點
asm、bin、hex、elf檔案
asm是組合語言源程式的副檔名,.asm檔案是以asm作為副檔名的檔案,是組合語言的源程式檔案。組合語言(Assembly Language)是面向機器的程式設計語言,是利用計算機所有硬體特性並能直接控制硬體的語言。在組合語言中,用助記符(Memoni)代替操作碼,用地址符號(Symbol)或標號(Label)代替地址碼。這樣用符號代替機器語言的二進位制碼,就把機器語言變成了組合語言。
bin檔案是二進位制檔案,是檔案格式binary的縮寫,字尾名為".bin"的檔案,表式它是binary格式。通常來說,它的內容是機器程式碼,組合語言編譯後的結果。
hex全稱baiIntel HEX,是可以燒寫到微控制器中,被微控制器執行的一種檔案格式。通常用於傳輸將被存於ROM或者EPROM中的程式和資料。是由一行行符合Intel HEX檔案格式的文字所構成的ASCII文字檔案。大多數EPROM程式設計器或模擬器使用Intel HEX檔案,其記錄由對應機器語言碼和/或常量資料的十六進位制編碼數字組成。
elf是Linux的主要可執行檔案格式。 elf檔案除了機器碼外,還包含其它額外的資訊,如段的載入地址,執行地址,重定位表,符號表等。
有段時間研究了一下elf檔案格式,做了很多筆記,有時間再更新上來。
#bin、elf的一些要點:
1.執行raw bin只需要將程式載入到其起始地址,即可執行; 執行elf程式則需要一個ELF Loader。uboot和Linux kernel啟動時沒有ELF Loader,所以燒在flash上的檔案只能是raw bin,即映象檔案image。
2.gcc編譯出來的是elf檔案,objcpy將elf檔案轉換為bin檔案。
我用了兩種方法反彙編.bin檔案。
a)bin檔案轉換為hex檔案,IDA開啟hex檔案
b)使用交叉編譯工具鏈進行bin的反彙編
arm-linux-objdump -D -b binary -m arm xxx.bin > xxx.asm
二、兩種實現方法
方法一
首先利用bin轉hex工具,將bin檔案轉換成hex檔案,類似的工具網上能找到,百度一下。
轉換完畢,使用IDA開啟hex檔案,這裡我用的是IDA Pro7.2
下面是IDA的步驟:
IDA開啟hex檔案進入如下介面
Processor type 選擇 ARM Little-endian,而後
點開Processor options,再點開Edit ARM architecture options,選擇ARMv7-M,然後一路ok。
此時出現的是資料表現型式
用快捷鍵c可轉成彙編程式碼,在地址等地方(畫紅線處)鍵c即可
彙編程式碼
方法二
利用交叉編譯工具鏈arm-linux 的arm-linux-objdump進行反彙編。
objdump是Linux下的反彙編目標檔案或者可執行檔案的命令,arm-linux-objdump與之引數相同。
常見用法:
1.-b 檔案格式 指定目標碼格式
2.-d 反編譯可執行段
3.-D 反編譯所有段
4.-EB,-EL指定位元組序
5.-f 顯示檔案的整體頭部摘要資訊
6.-h 顯示目標檔案中各個段的頭部摘要資訊
7.-I 顯示支援的目標檔案格式和CPU架構
8.-j name顯示指定section 的資訊
9.-m 主機型別 指定反彙編目標檔案時使用的架構
將elf或bin檔案反編譯到xx檔案:
arm-linux-objdump –D elf_file > dis_file arm-linux-objdump –D –b binary –m arm bin_file > dis_file 引數: -D 反編譯所有程式碼 -m 主機型別, arm -b 檔案格式, binary 如: arm-linux-objdump -D -b binary -m arm xxx.bin > xxx.asm 把xxx.bin反彙編到xxx.asm檔案
下載安裝arm-linux-gcc
我的是arm-linux-gcc-4.6.4-x86_64.tar.bz2。資源已上傳在稽核了,稽核完了再加個連結進來。
說一下安裝。
cp arm-linux-gcc-4.6.4-x86_64.tar.bz2 到 /usr/local
解壓
tar -jxvf arm-linux-gcc-4.6.4-x86_64.tar.bz2
解壓完後可以看到 /usr/local 下有個 opt 資料夾
在 opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4/bin 下可以看到交叉編譯器的工具。
neko@neko:/usr/local$ ls arm-linux-gcc-4.6.4-x86_64.tar.bz2 bin etc games include lib man opt sbin share src neko@neko:/usr/local$ ls opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4/bin/ arm-arm1176jzfssf-linux-gnueabi-addr2line arm-linux-addr2line arm-none-linux-gnueabi-addr2line arm-arm1176jzfssf-linux-gnueabi-ar arm-linux-ar arm-none-linux-gnueabi-ar arm-arm1176jzfssf-linux-gnueabi-as arm-linux-as arm-none-linux-gnueabi-as arm-arm1176jzfssf-linux-gnueabi-c++ arm-linux-c++ arm-none-linux-gnueabi-c++ arm-arm1176jzfssf-linux-gnueabi-cc arm-linux-cc arm-none-linux-gnueabi-cc arm-arm1176jzfssf-linux-gnueabi-c++filt arm-linux-c++filt arm-none-linux-gnueabi-c++filt arm-arm1176jzfssf-linux-gnueabi-cpp arm-linux-cpp arm-none-linux-gnueabi-cpp arm-arm1176jzfssf-linux-gnueabi-ct-ng.config arm-linux-ct-ng.config arm-none-linux-gnueabi-ct-ng.config arm-arm1176jzfssf-linux-gnueabi-elfedit arm-linux-elfedit arm-none-linux-gnueabi-elfedit arm-arm1176jzfssf-linux-gnueabi-g++ arm-linux-g++ arm-none-linux-gnueabi-g++ arm-arm1176jzfssf-linux-gnueabi-gcc arm-linux-gcc arm-none-linux-gnueabi-gcc arm-arm1176jzfssf-linux-gnueabi-gcc-4.6.4 arm-linux-gcc-4.6.4 arm-none-linux-gnueabi-gcc-4.6.4 arm-arm1176jzfssf-linux-gnueabi-gcov arm-linux-gcov arm-none-linux-gnueabi-gcov arm-arm1176jzfssf-linux-gnueabi-gprof arm-linux-gprof arm-none-linux-gnueabi-gprof arm-arm1176jzfssf-linux-gnueabi-ld arm-linux-ld arm-none-linux-gnueabi-ld arm-arm1176jzfssf-linux-gnueabi-ld.bfd arm-linux-ld.bfd arm-none-linux-gnueabi-ld.bfd arm-arm1176jzfssf-linux-gnueabi-ldd arm-linux-ldd arm-none-linux-gnueabi-ldd arm-arm1176jzfssf-linux-gnueabi-nm arm-linux-nm arm-none-linux-gnueabi-nm arm-arm1176jzfssf-linux-gnueabi-objcopy arm-linux-objcopy arm-none-linux-gnueabi-objcopy arm-arm1176jzfssf-linux-gnueabi-objdump arm-linux-objdump arm-none-linux-gnueabi-objdump arm-arm1176jzfssf-linux-gnueabi-populate arm-linux-populate arm-none-linux-gnueabi-populate arm-arm1176jzfssf-linux-gnueabi-ranlib arm-linux-ranlib arm-none-linux-gnueabi-ranlib arm-arm1176jzfssf-linux-gnueabi-readelf arm-linux-readelf arm-none-linux-gnueabi-readelf arm-arm1176jzfssf-linux-gnueabi-size arm-linux-size arm-none-linux-gnueabi-size arm-arm1176jzfssf-linux-gnueabi-strings arm-linux-strings arm-none-linux-gnueabi-strings arm-arm1176jzfssf-linux-gnueabi-strip arm-linux-strip arm-none-linux-gnueabi-strip neko@neko:/usr/local$
接下來就是新增環境變量了
vi etc/profile
開啟profile檔案,在最底下新增工具鏈的bin路徑
export PATH=$PATH:/usr/local/opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4/bin
儲存退出後 source /etc/profile 使之生效。
除了/etc/profile,我在 ~/.bashrc 的最後一行也加上了
export PATH=/usr/local/opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4/bin:${PATH}
儲存退出後依舊 source ~/.bashrc
配置好環境變數後,arm-linux-gcc -v 檢視
neko@neko:/usr/local$ arm-linux-gcc -v Using built-in specs. COLLECT_GCC=arm-linux-gcc COLLECT_LTO_WRAPPER=/usr/local/opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4/bin/../libexec/gcc/arm-arm1176jzfssf-linux-gnueabi/4.6.4/lto-wrapper Target: arm-arm1176jzfssf-linux-gnueabi Configured with: /work/builddir/src/gcc-4.6.4/configure --build=x86_64-build_unknown-linux-gnu --host=x86_64-build_unknown-linux-gnu --target=arm-arm1176jzfssf-linux-gnueabi --prefix=/opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4 --with-sysroot=/opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/sysroot --enable-languages=c,c++ --with-arch=armv6zk --with-cpu=arm1176jzf-s --with-tune=arm1176jzf-s --with-fpu=vfp --with-float=softfp --with-pkgversion='crosstool-NG hg+unknown-20130521.154019 - tc0002' --disable-sjlj-exceptions --enable-__cxa_atexit --disable-libmudflap --disable-libgomp --disable-libssp --disable-libquadmath --disable-libquadmath-support --with-gmp=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools --with-mpfr=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools --with-mpc=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools --with-ppl=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools --with-cloog=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools --with-libelf=/work/builddir/arm-arm1176jzfssf-linux-gnueabi/buildtools --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --enable-threads=posix --enable-target-optspace --without-long-double-128 --disable-nls --disable-multilib --with-local-prefix=/opt/TuxamitoSoftToolchains/arm-arm1176jzfssf-linux-gnueabi/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/sysroot --enable-c99 --enable-long-long Thread model: posix gcc version 4.6.4 (crosstool-NG hg+unknown-20130521.154019 - tc0002)
安裝完成。
使用arm-linux-objdump進行反彙編
neko@neko:~/test$ arm-linux-objdump -D -b binary -m arm test.BIN > test.asm neko@neko:~/test$ ls test.asm test.BIN neko@neko:~/test$ vi test.asm
結語
這也是我第一次反彙編.bin檔案,對比一下IDA與objdump,覺得IDA做elf格式的檔案優勢明顯,二進位制檔案用objdump看感覺更舒服一點(僅個人看法)。可能也是朋友給的這個檔案不全,所以IDA出來也不連貫吧。。。
彙編分析就不寫了,我比較囉嗦,寫個小東西都能寫出來長篇大論。以後有時間總結好了再記錄吧。
人非聖賢,我仍菜雞,有錯誤的地方還望各位大佬們指出,多多指教。
共勉~