摘要
安卓漏挖第7步,学会动态调试so文件。
在上篇文章我们静态分析了so,并通过修改so绕过登录验证,本文用动态调试的方法去绕过登录验证。
确认登录验证代码是否在so库
把apk拖入jeb中,android:debuggable="true",可以调试,如果为flase,需要动态将它改成true。(jeb安装包在附件中,解压后,运行jeb_wincon.bat即可)
在jeb中查看Mainactivity这个入口类,按Q,把他反编译成java代码
可以看到它调用了 Native方法check
check(MainActivity.this.ct, User_Name,User_Pass)
简化看下,双击MainActivity中的myJNI()
package demo2.jni.com.myapplication;
public class myJNI {
static {
System.loadLibrary("JniTest");
}
public myJNI() {
super();
}
public native String check(Object arg1, String arg2, String arg3) {
}
}
通过看代码,基本上就断定了程序的逻辑判断代码在so库中。
IDA静态分析so
参考上篇文章。
将apk解压,然后用IDA打开x86下的so。
这个so库中check函数的逻辑, 首先是检查签名 ,然后判断用户名是否为koudai,判断密码是否为black,如果都正确就返回登录成功,否则返回失败。
添加附加程序
IDA远程调试的依赖安装,我原来用的是ida7.6,远程调试这里好像不支持,所以换到7.7。
不同的ida版本适配不同的python版本,我用的是ida7.7,python用的是3.8.10。
看ida权威指南,要求安装包的时候,要用python -m安装。
Python -m Pip install keystone-engine
Python -m Pip install six
上传并运行ida_server ,将IDAPro\dbgsrv 目录下的android_x86_server push 到模拟器/data/local/tmp/目录下,给777权限,并./运行。
adb push android_x86_server
adb shell
cd /data/local/tmp/
chmod 777 android_x86_server
./android_x86_server
再起一个终端,进行端口转发 ,模拟器运行apk
>adb forward tcp:23946 tcp:23946
新起一个ida窗口 ,找到黑宝宝程序的包名,进行附加程序。
认识下动调时的IDA窗口
调试窗口
寄存器窗口
栈窗口
模块窗口(里面都是些so文件)
线程窗口
内存窗口
这些窗口对于新手有点不知如何布局,请参考[IDA动态调试窗口布局设计](https://xuanxuanblingbling.github.io/ctf/tools/2019/08/13/ida/)
开始动调
在modules窗口中Ctrl+F搜索找到libJniTest.so库, 点进去会有so中的函数方法的列表。找到check方法并点击,查看Debug窗口的汇编代码。
按tab键对其进行反编译却报错
这是因为ida在动态调试的时候,没有解析函数段导致的。(看调试窗口中的地址是红色的) 点击代码,鼠标右键,选择create function,还是失败,参考 ( https://www.cnblogs.com/studyskill/p/7714485.html。)
选中代码一直到retn,然后右键发现找不到create function了,但是可以用快捷键p代替 ,然后再用tab键就可以反编译了。
在反编译窗口按空格,转成图形模式,看的逻辑会更清晰些,程序里面有三处关键跳转,分别用来判断签名是否一致,用户名是否一致,密码是否一致。
点击两个jz命令处,按f2下断点
标志位破解
按F9运行程序,然后在模拟器随便输入一个用户名和密码,点击登录, 看到程序断在了第一个断点跳转处,更改标志位ZF的值,原本是0,改成1。F8执行本条指令,发现IDA改变了原来的跳转方向。继续按F8到第二个断点处,更改标志位ZF的值,原本是0,改成1。F8执行本条指令,发现IDA改变了原来的跳转方向,按F9.可看到模拟器显示登陆成功。
修改内存破解
我们知道cmpsb是比较exi和edi中的值,在Hex窗口中,右键,synchro对齐到exi,可以看到是我们输入的用户名123,synchro对齐到edi,可以看到是koudai,那我们在hex窗口把exi中的值改成koudai。
那我们在hex窗口把exi中的值改成koudai,对应的16进制为6B 6F 75 64 61 69。
同样把下面密码校验的strcmp函数修改完成后,F9运行程序可以看到模拟器弹出登陆成功。
参考链接
https://www.52pojie.cn/thread-742686-1-1.html
https://xuanxuanblingbling.github.io/ctf/tools/2019/08/13/ida/
https://www.cnblogs.com/studyskill/p/7714485.html