最近逆向一个ARM架构下的linux可执行文件,因为静态分析获取到的信息有限,所以打算搭建个ARM Linux下的IDA Pro远程调试服务端。
折腾了一段时间,最终总算是搭建成功了!
简述下环境参数:
- CPU: Cortex A53 * 4
- 内存: 2GiB
- 系统环境:Ubuntu 16.04 for ARM64
- 内核版本:GNU/Linux 4.4.103 aarch64
IDA Pro针对特定软件环境的远程调试服务端程序,可以在IDA Pro安装目录下的dbgsrv目录下找到,因为我需要调试的环境是基于ARM架构的Linux,所以这里采用armlinux_server这个程序。
先把远程调试服务端(armlinux_server)复制到目标板的文件系统中(不是armuclinux_server哦,uclinux是实时操作系统)。
然后为其加上可执行权限并运行:
chmod +x armlinux_server ./armlinux_server
然而终端提示:
-bash: ./armlinux_server: No such file or directory
出现这个错误的原因是因为可执行程序所依赖的库系统未找到。
我们可以执行以下命令查看可执行程序所依赖那些共享库:
readelf -d armlinux_server
终端输出如下:
Dynamic section at offset 0xb4030 contains 30 entries: 标记 类型 名称/值 0x00000001 (NEEDED) 共享库:[libpthread.so.0] 0x00000001 (NEEDED) 共享库:[libthread_db.so.1] 0x00000001 (NEEDED) 共享库:[librt.so.1] 0x00000001 (NEEDED) 共享库:[libstdc++.so.6] 0x00000001 (NEEDED) 共享库:[libm.so.6] 0x00000001 (NEEDED) 共享库:[libc.so.6] 0x00000001 (NEEDED) 共享库:[libgcc_s.so.1] 0x0000000c (INIT) 0xa788 0x0000000d (FINI) 0xa1440 0x00000019 (INIT_ARRAY) 0xc4000 0x0000001b (INIT_ARRAYSZ) 40 (bytes) 0x0000001a (FINI_ARRAY) 0xc4028 0x0000001c (FINI_ARRAYSZ) 4 (bytes) 0x00000004 (HASH) 0x8188 0x00000005 (STRTAB) 0x9570 0x00000006 (SYMTAB) 0x8800 0x0000000a (STRSZ) 2353 (bytes) 0x0000000b (SYMENT) 16 (bytes) 0x00000015 (DEBUG) 0x0 0x00000003 (PLTGOT) 0xc4148 0x00000002 (PLTRELSZ) 1576 (bytes) 0x00000014 (PLTREL) REL 0x00000017 (JMPREL) 0xa160 0x00000011 (REL) 0xa130 0x00000012 (RELSZ) 48 (bytes) 0x00000013 (RELENT) 8 (bytes) 0x6ffffffe (VERNEED) 0xa050 0x6fffffff (VERNEEDNUM) 6 0x6ffffff0 (VERSYM) 0x9ea2 0x00000000 (NULL) 0x0
可见依赖的共享库,都是gcc自己的库,可能是因为我的系统是ARM64的,程序是32位的,并且系统没有32位GCC的运行库,才导致程序运行失败。
好在是ubuntu,直接apt搜索下相关的软件包:
apt search arm-linux-gnueabi
匹配的结果很多,这里就不展示了,我选了个4.9 的GCC,用apt安装:
sudo apt install gcc-4.9-arm-linux-gnueabihf
安装完成不代表系统就知道有这个库了,还需要做一些配置,这时可以看看/usr目录下有没有相关目录:
ls -l /usr
终端输出:
总用量 108 drwxr-xr-x 4 root root 4096 1月 25 22:03 aarch64-linux-gnu drwxr-xr-x 5 root root 4096 1月 25 21:53 arm-linux-gnueabi drwxr-xr-x 5 root root 4096 1月 25 22:09 arm-linux-gnueabihf drwxr-xr-x 2 root root 45056 1月 26 22:07 bin drwxr-xr-x 2 root root 4096 11月 21 14:56 games drwxr-xr-x 36 root root 16384 1月 24 22:01 include drwxr-xr-x 95 root root 4096 1月 25 21:53 lib drwxr-xr-x 10 root root 4096 2月 16 2017 local drwxr-xr-x 2 root root 12288 1月 26 07:56 sbin drwxrwxr-x 211 1002 1001 4096 1月 26 07:54 share drwxr-xr-x 4 root root 4096 1月 25 00:07 src
切换到arm-linux-gnueabihf目录下再看看:
总用量 12 drwxr-xr-x 2 root root 4096 1月 25 22:09 bin drwxr-xr-x 33 root root 4096 1月 25 22:10 include drwxr-xr-x 2 root root 4096 1月 25 22:09 lib lrwxrwxrwx 1 root root 24 4月 16 2016 libsf -> ../arm-linux-gnueabi/lib
lib目录就是我们真正关心的东西,记录lib目录的绝对路径,然后去编辑系统共享库配置文件:
## /etc/ld.so.conf 文件一般是系统共享库的配置文件,在ubuntu下,它会包含/etc/ld.so.conf.d目录下所有的conf文件 ## 所以我们只要去/etc/ld.so.conf.d目录下增加个配置文件就可以达到目的 cd /etc/ld.so.conf.d sudo su echo "/usr/arm-linux-gnueabihf/lib" > arm-linux-gnueabihf.conf
以上命令只是在/etc/ld.so.conf.d目录下新建了一个arm-linux-gnueabihf.conf文件,内容为/usr/arm-linux-gnueabihf/lib。
然后记得更新系统共享库配置:
sudo ldconfig
接着尝试运行远程调试服务端:
./armlinux_server
终端还是提示:
-bash: ./armlinux_server: No such file or directory
这里我被卡了很久,后来在网上找到个方法:
objdump -j .interp -s armlinux_server
以上命令会把可执行文件的.interp段的内容显示出来,终端输出如下:
armlinux_server: 文件格式 elf32-littlearm Contents of section .interp: 8154 2f6c6962 2f6c642d 6c696e75 782e736f /lib/ld-linux.so 8164 2e3300 .3.
可以看出是个绝对路径,那么我们试试把刚才安装的库做个符号链接到这个绝对位置,再运行服务端试试:
sudo ln -s /usr/arm-linux-gnueabihf/lib/ld-linux.so.3 /lib/ld-linux.so.3 ./armlinux_server
执行后输出如下:
IDA ARM Linux 32-bit remote debug server(ST) v1.22. Hex-Rays (c) 2004-2017 Listening on 0.0.0.0:23946...
至此,成功配置好并启动了IDA Pro的远程调试服务端。