0x00 前言
上一篇分享了使用 Android studio和 Jeb对 Apk 文件直接进行动态调试,本文将分享使用 IDA pro 调试 so。
调试的 apk 文件还是使用 CTF案例4 的文件,已经上传到知识星球,可自行下载
本文涉及技术:
- IDA pro 工具使用
- 调试android 应用
- 动态调试技术
注意:本案例所需要的 apk 文件,已经上传到知识星球,需要的朋友可以到文末关注后下载
0x01 准备
1、下载案例 Apk 文件
使用 Android Killer 工具修改配置文件,加上 android:debuggable=”true”这个配置,这样 apk 就可以被调试了。
![1660661572_62fbaf44874ec390c7f1a.png!small?1660661572861](https://image.3001.net/images/20220816/1660661572_62fbaf44874ec390c7f1a.png!small?1660661572861)
2、找到IDA_Pro_v7.5_Portable\dbgsrv
目录,里面文件对应不同平台的 server 文件:
![1660661588_62fbaf5447e56247a4f11.png!small?1660661588781](https://image.3001.net/images/20220816/1660661588_62fbaf5447e56247a4f11.png!small?1660661588781)
3、查看手机的 cpu 架构:
![1660661601_62fbaf6145f9d7bb70888.png!small?1660661601912](https://image.3001.net/images/20220816/1660661601_62fbaf6145f9d7bb70888.png!small?1660661601912)
4、调试的手机是 android 的 arm64-v8a,可以选择 android_server64,把这个文件发送到 手机的/data/local/tmp
目录,然后赋予执行权限,最后执行。
![1660661613_62fbaf6d01e4e49ed0d57.png!small?1660661613146](https://image.3001.net/images/20220816/1660661613_62fbaf6d01e4e49ed0d57.png!small?1660661613146)
默认的端口是 23946 ,这里故意改为 22222
5、端口转发
adb forward tcp:11111 tcp:22222
这里表示将本地 11111 端口(我本机是 windows),转发到远程手机 22222 端口:
![1660661630_62fbaf7e6c3dc47200030.png!small?1660661630518](https://image.3001.net/images/20220816/1660661630_62fbaf7e6c3dc47200030.png!small?1660661630518)
准备工作做好之后,将讲解两种方式调试,一种就是普通启动 apk 的调试,一种是以 Debug 模式启动 apk 的调试。如果调试的代码逻辑,在启动之后,则可以使用普通启动apk的调试模式,如果调试的代码逻辑在启动的时候就执行了,这时需要使用 Debug 模式启动 Apk 进行调试。
0x02 普通模式调试
1、adb 启动对应的 Activity,这里使用 普通模式启动 apk
adb shell am start -n com.example.hellojni/com.example.application.IsThisTheRealOne
2、打开 IDA pro 64 位版本,加载 arm64-v8a 中 libhello-jni.so 文件
3、IDA 调试配置
选择 Remote ARM Linux/Android debugger 调试
![1660661646_62fbaf8ecbf4548ed9799.png!small?1660661647218](https://image.3001.net/images/20220816/1660661646_62fbaf8ecbf4548ed9799.png!small?1660661647218)
选择 Debugger options 勾选以下三个选项
![1660661671_62fbafa75122a8381f6e1.png!small?1660661671685](https://image.3001.net/images/20220816/1660661671_62fbafa75122a8381f6e1.png!small?1660661671685)
选择 Process options 进行配置:
![1660661678_62fbafae9f641ac58d6d5.png!small?1660661679030](https://image.3001.net/images/20220816/1660661678_62fbafae9f641ac58d6d5.png!small?1660661679030)
选择需要 attach 的进程
![1660661689_62fbafb9ec67d1aaa3d21.png!small?1660661690100](https://image.3001.net/images/20220816/1660661689_62fbafb9ec67d1aaa3d21.png!small?1660661690100)
4、出现 Debugger warning
这表示在手机中找到和本地加载相同的 so 文件,选择 same:
![1660661704_62fbafc8bc4133fcef502.png!small?1660661705133](https://image.3001.net/images/20220816/1660661704_62fbafc8bc4133fcef502.png!small?1660661705133)
5、在模块中搜索,需要调试的模块
![1660661714_62fbafd224aad1de56342.png!small?1660661714420](https://image.3001.net/images/20220816/1660661714_62fbafd224aad1de56342.png!small?1660661714420)
然后定位要打断点的函数:
![1660661730_62fbafe20cd95c01aa627.png!small?1660661730249](https://image.3001.net/images/20220816/1660661730_62fbafe20cd95c01aa627.png!small?1660661730249)
6、打断点
这里可以直接使用快捷键 F5 ,然后在 c/c++ 的伪代码里打断点:
![1660661744_62fbaff0243ab0bb174ac.png!small?1660661744548](https://image.3001.net/images/20220816/1660661744_62fbaff0243ab0bb174ac.png!small?1660661744548)
7、开始调试
点击 Quick debug view,打开 Locals窗口,F9 运行,F8 单步步过,进行调试
![1660661756_62fbaffc4927544038e63.png!small?1660661756521](https://image.3001.net/images/20220816/1660661756_62fbaffc4927544038e63.png!small?1660661756521)
8、 成功拿到 flag 值。
0x03 Debug模式调试
1、打开 Android device monitor工具
这个工具在 Android studio 的Android\Sdk\tools
目录下
2、以 Debug 模式启动 apk的 Activity
adb shell am start -D -n com.example.hellojni/com.example.application.IsThisTheRealOne
发现在 Android device monitor中,将要调试的程序前面,多了一个红色的虫子
![1660661774_62fbb00ed6ad6ff076fab.png!small?1660661775093](https://image.3001.net/images/20220816/1660661774_62fbb00ed6ad6ff076fab.png!small?1660661775093)
3、打开 IDA ,加载 so(同上)
4、IDA 调试配置,勾选三项等,找到要调试的进程(同上)
5、执行 jdb 命令
jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8608
这里的端口,可以在 Monitor 中查看到
执行完成之后,红色的虫子变为绿色的虫子,接着就可以开始调试了
![1660661788_62fbb01c9c3a74578934b.png!small?1660661788770](https://image.3001.net/images/20220816/1660661788_62fbb01c9c3a74578934b.png!small?1660661788770)
6、开始调试,按 F9 ,知道出现
![1660661804_62fbb02cd6fc89d2bba82.png!small?1660661805156](https://image.3001.net/images/20220816/1660661804_62fbb02cd6fc89d2bba82.png!small?1660661805156)
这个时候就加载到需要调试的 so 了
7、在模块中查找需要调试的模块,以及模块中的具体函数(同上)
![1660661813_62fbb03553de9e3fd5eb0.png!small?1660661813894](https://image.3001.net/images/20220816/1660661813_62fbb03553de9e3fd5eb0.png!small?1660661813894)
8、继续调试
打开 Locals 查看变量,
![1660661831_62fbb0478bcce9c22276c.png!small?1660661831779](https://image.3001.net/images/20220816/1660661831_62fbb0478bcce9c22276c.png!small?1660661831779)
成功拿到 flag 值。
0x04 结语
在 Android 逆向中,动态调试是非常重要的一个技术,IDA pro 时调试 so 代码的利器。感兴趣的朋友,可以下载案例的 apk 文件,实战起来。
本文转载于FreeBuf.COM,原作者:act0rn
原地址:Android渗透测试12:IDA动态调试so – FreeBuf网络安全行业门户
若侵权请联系删除
请登录后查看评论内容