吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 9797|回复: 22
收起左侧

[Android CTF] 一道Android CTF题

  [复制链接]
a1046830 发表于 2019-10-13 00:01
链接:https://pan.baidu.com/s/1oOH9RgukXJcXianq8jgYhg
提取码:5lzf
这个是我调试的样本APK,是阿里逆向前几年的一道题。
1.jpg

apktool d ali.apk ,解包之后打开文件夹发现存在so文件,于是用JEB或者android killer打开APK

​ 2.jpg 3.jpg
先查找入口主类,发现是com.yaotong.crackme.MainActivity
4.jpg
然后看到android:bebuggable ="true"这个属性并没有在APK里面,想要动态调试APK的话,那么待会我就需要添加这段代码 。
先点开主类查看函数
​ 4.jpg.png
主界面只有一个Button,所以button点击的函数事件就是检测密码,然后这个函数securityCheck()是注册在so文件里面的, 使用IDA 打开so文件,查看securityCheck()函数
​ 5.jpg
然后F5反汇编,其中这段代码是说输入密码和正确密码逐位对比,所以我们可以动态调试so输出正确密码
​ 6.jpg 7.jpg
但是这题不可能有这么简单,CTRL+S查看init_array,没发现什么异常,再检测JNI_Onload,看到里面有一大堆代码,猜测应该是用来反调试用的(反调试手段不可能就只有个android:debuggable="false"或者不加这个属性这么简单,大多数情况会在init_array或者JNI_Onload开启线程检测TracePid或者端口23946之类的,因为程序启动的时候最先JNI_Onload和init_array是在主界面启动之前响应,所以在这里面加入反调试代码最好)
8.jpg
​
然后修改 AndroidManifest.xml添加android:debuggable="true",打包APK:apktool b ali -o ll.apk,使用签名工具对ll.apk进行签名,这里我用的是android killer进行签名,使用adb 命令将APK安装到手机 adb install C:\Users\a1046\Desktop\SecretJungle\ll_sign.apk
​
想要动态调试so文件,需要将IDA pro里面的android_server push 到手机 /data/local/tmp文件夹下,并赋予777权限
adb push XXXXX(路径)\android_server /data/local/tmp
adb shell
su
cd /data/local/tmp
chmod -R 777 android_server,然后ls -al 查看,然后./android_server启动,重开一个cmd,输入adb forward tcp:23946 tcp:23946,然后以调试模式启动程序 adb shell am start -D -n com.yaotong.crackme/.MainActivity
​ 9.jpg 10.jpg 11.jpg
​
打开IDA ,点击debugger->select debugger ,这样选择,然后确定
​ 12.jpg
然后再Debugger->process options 进行如下设置
​ 13.jpg
然后Debugger->attach to process ,找到目标进程 点击进去
​
14.jpg
接下来出现的选项点yes,然后Debugger->Debugger options进行如下设置
​ 15.jpg
设置好了之后按F9,启动程序,打开ddmx(SDK tools 文件夹),打开cmd输入jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700,然后接着f9,直到jdb attach 住了(IDA出现的界面选项中 有yes点yes,有same 点same);
​ 16.jpg 17.jpg
​
再linker加载进来之后ctrl+s搜索目标so ,看到so已经加载进来
​ 18.jpg
cancel,然后再右侧moudules中搜索so 打开Jni_onload,下个断点,F9,出现选项点yes;
​
​ 19.jpg

接着开始F7 F8单步调试。多次调试发现在运行玩BLX R7之后程序会退出,那么此处应该就是反调试检测机制了。
打开R7寄存器 出现pthread_create ,证明猜测正确
​ 20.jpg
然后使用用IDA pro静态打开so 文件 找到汇编代码,产看blx R7 的十六进制,37 FF 2F E1

​ 21.jpg 22.jpg
使用010 Editor或者win hex修改成 00 00 00 00 就是直接nop掉这条指令(直接删除指令的话,文件会发生错乱,因为so文件有固定的格式,比如很多段的内容,每个段的偏移值都是保存的,这样删除的话会影响偏移值)。
然后重新打包,签名,安装到手机,之后就是正常的动态调试了,启动程序,启动android_server ,转发端口
打开IDA->Debugger ->attach->Remote Armlinux/Android Debugger ,确定
​ 23.jpg
找到com.yaotong.crackme进程点击进去。在modules查看crackme.so 打开SecurityCheck函数,下个断点,F9在手机上随便输入密码:crackSample,开始单步调试
​
​ 24.jpg 25.jpg
调试到这的时候,点击R0寄存器查看 发现是我输入的密码
​ 26.jpg 27.jpg
那么R2应该就是正确密码了,为aiyou,bucuoo(0x61为a)
​
打开程序检测 输入 ,正确 搞定
​ 28.jpg
附上我博客原文地址
https://blog.csdn.net/Viewz/article/details/97757862

免费评分

参与人数 6吾爱币 +14 热心值 +6 收起 理由
撸冰花 + 1 + 1 谢谢@Thanks!
qtfreet00 + 9 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
笙若 + 1 + 1 谢谢@Thanks!
thenow + 1 + 1 我很赞同!
夕日黄 + 1 + 1 我很赞同!
一只大八哥 + 1 + 1 虽然看不太懂,但是我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Inkpig 发表于 2020-6-26 15:50
hangez 发表于 2019-10-31 14:20
我想问一下,为什么我在动态调试的时候没有加载到libcrackme.so的时候程序就断开了。

我试了一下,跟你差不多的情况,用的sdk里面的模拟器,在libc.so断下后,F8直接就闪退了

 楼主| a1046830 发表于 2019-10-13 14:16
608岁的老头 发表于 2019-10-13 12:44
楼主,我和你做的不太一样,动态调试的时候只有,我用 的模拟器,这个apk不会有模拟器检测吧

我这个是一两个月之前做的,有点忘了,动态调试试试手机
头像被屏蔽
52pojieggh 发表于 2019-10-13 01:36
永远的永远 发表于 2019-10-13 10:41
羡慕,我不是学逆向的料
zyy22664488 发表于 2019-10-13 11:18
感谢分享
608岁的老头 发表于 2019-10-13 12:44
楼主,我和你做的不太一样,动态调试的时候只有 2019-10-13_124029.png ,我用 的模拟器,这个apk不会有模拟器检测吧
huohu117 发表于 2019-10-14 13:27
太复杂,看不懂
thornfish 发表于 2019-10-14 16:05
a1046830 发表于 2019-10-13 14:16
我这个是一两个月之前做的,有点忘了,动态调试试试手机

动态调试的大概过程是怎么样的呢
 楼主| a1046830 发表于 2019-10-14 18:09
thornfish 发表于 2019-10-14 16:05
动态调试的大概过程是怎么样的呢

和我上边写的一样的。。不过我调试之前加了个adb 命令 setenforce 0
酷酷的囍 发表于 2019-10-14 19:20
多谢楼主分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 21:35

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表