查看原文
其他

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

bxc 看雪学院 2019-05-26

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





- End -


看雪ID:bxc               

https://bbs.pediy.com/user-423318.htm


本文由看雪论坛 bxc 原创

转载请注明来自看雪社区



热门图书推荐:

立即购买!


(点击图片即可进入)


热门技术文章:        





公众号ID:ikanxue

官方微博:看雪安全

商务合作:wsc@kanxue.com


点击下方“阅读原文”

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存