Android IDA so文件分析、动态调试-xctf-so easy
无反调试步骤:
1)adb push d:\android_server(IDA的dbgsrv目录下) /data/local/tmp/android_server(这个目录是可以随便放的,server文件根据内核版本更换)。
2) adb shell
3) su(一定要有root权限)
4) cd /data/local/tmp
5) chmod 777 android_server (给android_server可执行权限)
./android_server对本地设备端口进行监听
6)再开一个cmd:
adb forward tcp:23946 tcp:23946(端口转发,调试手机上的某个进程要有协议支持通信)让远程调试端IDA可以连接到被调试端
7)使用IDA连接上转发的端口,查看设备的所有进程,找到需要调试的进程。具体步骤方法为:在Debugger选项卡中选择Attach,选择android debugger,点击Ok。
8)动静结合方式(基地址+相对地址)确定函数地址进行调试。
1)启动android_server
2)端口转发adb forward tcp:23946 tcp:23946
3)adb shell am start -D -n 包名/类名;出现Debugger的等待状态
(说明:以启动模式启动,是停在加载so文件之前,包名可以在androidmanifest文件中找到)
4)打开IDA,附加上对应的进程之后,设置IDA中的load so时机,即在debug options中设置;
5)运行命令:jdb -connect com.sun.jdi.SocketAttach:hostname=localhost, port=8700
6)点击IDA运行按钮,或者F9快捷键。
一、使用IDA对so文件进行分析
导出so文件,使用IDA打开。
在IDA中直接搜索该函数,只有一个结果,直接点进去看看。
可以看到通过一系列计算之后,得到的值需要为f72c5a36569418a20907b55be5bf95ad
通过对其算法进行分析,其计算过程是先将输入值前半部分与后半部分调换,后将相邻数值两两对换,得到flag:90705bb55efb59da7fc2a5636549812a
二、使用IDA对so文件进行调试
https://blog.csdn.net/u012195899/article/details/52780062
找到IDA中的dbgsrv文件夹下的android_server文件,根据内核版本,将这个文件使用adb命令上传到手机/data/local/tmp目录下
上传过程中有时会出现 Read-only file system 提示,大概率是权限问题:
1、adb remount,这条命令的功能是重新装载Android文件系统;
2、adb shell—su— mount -o rw,remount /system
给予权限777(chmod 777 文件名)后启动传入的脚本文件。
成功启动后开启端口转发(固定端口23946)。
adb forward tcp:23946 tcp:23946
- 启动后无法获取模拟器IP, 启动后提示 Address already in use(端口被占用)
- 通过查询发现IDA,frida等,由于内核问题都无法使用雷电模拟器进行连接,故更换夜神模拟器
https://my.oschina.net/u/4940693/blog/4927341
使用夜神模拟器成功连接。
ctrl+f 搜索需要附加的包名
成功附加进入,可以动态分析so文件。
通过ctrl+s 可以打开当前加载的so文件目录,通过搜索so文件名称,找到需要的so文件。选择带有X标识的文件,进入即可跳转至所需so文件内。
在静态调试的IDA中找到函数的偏移地址,然后在动态调试的IDA加上so文件基址,跳转至对应函数位置。
后续调试报错,判断还是内核问题,等待使用真机尝试。
真机使用后还是一样报错,尝试寻找原因。
更换android_server64文件,重启设备后,成功连接设备。
通过基地+偏移地址找到目标函数。
出现提示 got unknown signal #33
重启IDA后,继续操作,成功断在断点处,未知原因。
F8单步调试,查看寄存器改变。(前面出现问题是因为键盘F8无法使用!!!!!)
后续调试与OD调试相似。
本文来自博客园,作者:xyxyxyxyxyxy,转载请注明原文链接:https://www.cnblogs.com/my1127/p/16133651.html