参考链接:
https://www.52pojie.cn/thread-1315444-1-1.html
apk包:
链接: https://pan.baidu.com/s/1jXfS1qJyZDflKhgzZb8zMQ 密码: htop
aliCrackme一道经典ctf老题了,主要学习下,记录下解题过程
本题知识点:
so逆向分析、动态调试、反反调试
下载安装apk
随便输入发现输出验证码校验失败
用jadx打开apk 搜索验证码校验失败jadx-gui 自毁程序密码_1.0原版.apk
分析代码,发现点击事件之后有个securityCheck方法,是native方法,需要分析sopublic native boolean securityCheck(String str);
1 | public void onClick(View v) { |
解压自毁程序密码_1.0原版.apk
用IDA打开”自毁程序密码_1.0原版/lib/armeabi/libcrackme.so”
搜索securityCheck方法,按F5看下伪c代、
分析一下代码的执行,点击 v3 通过JNIEnv* 还原类似((_DWORD )v3 + 676))格式的指令,重命名以及注释的方式记录分析,如下图
分析代码发现v6是真实代码,双击off_628C查看v6的值
发现有个aWojiushidaan值,输入到密码框试试看
发现仍验证码校验失败,需要动态调试查看真实的值
IDA动态调试,要先吧android_server放到手机上
1 | adb push /Applications/IDAPro7.0-tea/ida.app/Contents/MacOS/dbgsrv/android_server /data/local/tmp |
打开IDA,选择Debugger-Select debugger
选择Remote ARM Linux/Android debugger
选择Debugger-Process options
填写Hostname、Port
选择Debugger-Attach to process
搜索com.yaotong.crackme,选择ok
Ctrl+S 搜索crackme,选择带x的
内存的绝对地址=so文件的基地址+要调试的函数的偏移量
记录基地址D7F1D6BC
在打开一个ida查找so文件偏移地址
mac 上 IDA双开
open -n /Applications/IDAPro7.0-tea/ida.app
打开后搜索选择check函数,按空格后查看地址,查看地址000011A8
然后D7F1D6BC+000011A8=D7F1E864
经计算可知,函数的绝对地址就是D7F1E864在IDA中 使用快捷键G跳转到地址的位置,也就是要调试的函数位置
按F2打断点,按F8继续运行(F8单步调试不进入函数F7单步调试进入函数
然后发现app直接崩溃了,应该是有反调试
修改应用为debuggable
1 | ro.debuggable app全局可调试 |
然后重启下手机
测试用debug模式启动app
adb shell am start -D -n com.yaotong.crackme/.MainActivity
查看进程
检测是否被调试:利用Linux系统 ptrace 来实现,当应用被调试时应用内存里的TracerPid字段就不为0,只要是不为0的时候,就会直接的退出程序,达到反调试的目的。
1 | 进入设备 |
用debug模式启动
adb shell am start -D -n com.yaotong.crackme/com.yaotong.crackme.MainActivity
IDA打开Debugger-Debugger options
选择Suspend on thread start/exit、Suspend on library load/unload
1.用调试模式打开app
adb shell am start -D -n com.yaotong.crackme/com.yaotong.crackme.MainActivity
2.ida进行调试,调试选项勾选选择Suspend on thread start/exit、Suspend on library load/unload
打开ida不用打开so直接进行调试
3.启动jdb
ps -e | grep com.yaotong.crackme
adb forward tcp:8700 jdwp:4495(4495为上面获得的APP进程ID)
jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
1 | jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700 |
3.搜索crackme.so,在jni_onload上下断点
app会停到没有加载的地方
按F8然后Ctrl+s搜索crackme,如果没有就在进行单步调试直到搜索到crackme
记录D7DB06BC然后静态找JNI_ONLoad的地址00001B9C
D7DB06BC+00001B9C=D7DB2258
按g跳转到该地址下断点,单步执行到jni_onload
停到JNI_Onload里了
BLX R7的位置跳了出去,很可疑的位置需要重点注意
静态分析找到R7的位置进行修改
切换hex view
用010打开crackme.so
找到37 FF 2F E1位置修改为 00 00 00 00
然后保存
反编译重打包app
1 | apktool d 自毁程序密码_1.0原版.apk -o 1 |
正常启动app
打开IDA进行调试,给check函数下断点,在断点停下了
按F5,查看v6的值发现是aiyou,bucuoo
在输入框中输入