.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。

arm-linux-gcc安裝包


說一下安裝。
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出來也不連貫吧。。。

匯編分析就不寫了,我比較啰嗦,寫個小東西都能寫出來長篇大論。以后有時間總結好了再記錄吧。

匯編指令太多,附一個arm指令集中文手冊chm版,方便查閱。

arm指令集中文手冊chm版

人非聖賢,我仍菜雞,有錯誤的地方還望各位大佬們指出,多多指教。
共勉~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM