ARM Linux下搭建IDA Pro远程调试环境

最近逆向一个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的远程调试服务端。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据