IT评测·应用市场-qidao123.com技术社区

标题: 一道Android题目逆向动态调试 [打印本页]

作者: 吴旭华    时间: 2022-11-26 07:19
标题: 一道Android题目逆向动态调试
题目来源于海淀区网络与信息安全管理员大赛,题目中将加密验证算法打包进.so,在程序中动态调用check。
本题目通过System.loadLibrary("native-lib")加载了libnative-lib.so文件,该文件通过jeb可以实现提取

图1 题目关键代码
调试环境选择与配置

调试环境

adb的基础配置

  1. adb connect 127.0.0.1:7555
复制代码
 

图2 adb 服务端连接
  1. adb install test.apk
复制代码
 

图3 adb shell连接
 
【----帮助网安学习,以下所有学习资料免费领!加vx:yj009991,备注 “博客园” 获取!】
 ① 网安学习成长路径思维导图
 ② 60+网安经典常用工具包
 ③ 100+SRC漏洞分析报告
 ④ 150+网安攻防实战技术电子书
 ⑤ 最权威CISSP 认证考试指南+题库
 ⑥ 超1800页CTF实战技巧手册
 ⑦ 最新网安大厂面试题合集(含答案)
 ⑧ APP客户端安全检测指南(安卓+IOS)
 
应用程序的配置

  1. ./adb shell am start -D -n com.example.dynamic/.MainActivity
复制代码


图4 adb 启动程序分析

图5 adb 动态调试程序
IDA 的配置

  1. ./adb push android_x86_server /data/local/tmp
复制代码
 

图6 查看tmp文件夹权限
  1. chmod +x android_x86_server
复制代码
 
  1. ./adb.exe forward tcp:23946 tcp:23946
复制代码
 

图7 启动IDA 调试server端

图8 配置IDA动态调试

图9 IDA远程attach

图10 附加到指定进程

图11 dynamic程序界面
  1. ./adb forward tcp:8700 jdwp:1535
复制代码
 
  1. jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
复制代码
 

图12 IDA提示检测到本地.so

图13 附加到调试进程后,dynamic界面

图14 IDA中显示断点
.so的调试

反调试绕过


图15 IDA调试选项配置

图16 查看IDA中的代码段

图17 adb shell中查看内存中的数据地址分布

图18 重置eax的值
可以直接右键或者在eax寄存器上使用快捷键0重置

图19 重置eax的值
注册native的方法

  1. static JNINativeMethod jniMethods[] = {
  2. {"check", "(Ljava/lang/String;)Z", (void *)hello},
  3. };
  4. boolean xxxx( char* s) {
  5. // do something
  6. return JNI_TRUE;
  7. }
  8. #在JNI_OnLoad中调用RegisterNatives方法注册Natives方法到JVM,建立映射关系。
  9. int JNI_OnLoad(JavaVM *vm, void *reserved)
  10. {
  11.     JNIEnv *env;
  12.     if ((*vm)->GetEnv(vm, (void **)&env, JNI_VERSION_1_4) != JNI_OK) {
  13.         return JNI_ERR;
  14.     }
  15.     jclass cls = (*env)->FindClass(env, "LHelloJNI");
  16.     if (cls == NULL)
  17.         return JNI_ERR;
  18.     int len = sizeof(jniMethods) / sizeof(jnimethods[0]);
  19.     (*env)->RegisterNatives(env, cls, jniMethods, len);
  20.     return JNI_VERSION_1_4;
  21. }
复制代码
check 函数的定位


图20 查找check函数
  1. const char \*name: Java中声明的native方法。<br>const char \*signature:方法的签名。<br>void \*fnPtr: 函数指针
复制代码


图21 定位check函数
MD5的简单调试

  1. *(_OWORD *)v63 = xmmword_B2E6FA40;<br>.rodata:B2E6FA40 xmmword_B2E6FA40 xmmword 1032547698BADCFEEFCDAB8967452301h
复制代码
 
  1. .text:B2E51040 8D 84 24 B4 00 00 00    lea     eax, [esp+0B4h]<br>.text:B2E51047 89 44 24 04             mov     [esp+4], eax<br>.text:B2E5104B 8D 44 24 58             lea     eax, [esp+58h]<br>.text:B2E5104F 89 04 24                mov     [esp], eax<br>.text:B2E51052 E8 A9 E7 FF FF          call    __Z4ffffP7MD5_CTXPh ; ffff(MD5_CTX *,uchar *)
复制代码
 
  1. Python>esp=get_reg_value('esp')<br>Python>data=get_bytes(esp+0xb4,16)<br>Python>data.hex()<br>'a82e0cb168bfe134f22dbde167cf046c'
复制代码
 
  1. >>> import hashlib<br>>>> result=hashlib.md5("wojiushidaan0!!!".encode())<br>>>> result<br><md5 _hashlib.HASH object @ 0x00000167FF8BDEF0><br>>>> result.hexdigest()<br>'a82e0cb168bfe134f22dbde167cf046c'
复制代码
 
  1. .text:B2F11398 89 54 24 08             mov     [esp+8], edx<br>.text:B2F1139C 8B 44 24 14             mov     eax, [esp+14h]<br>.text:B2F113A0 89 44 24 04             mov     [esp+4], eax    ; s2<br>.text:B2F113A4 89 0C 24                mov     [esp], ecx      ; s1<br>.text:B2F113A7 E8 84 E4 FF FF          call    _memcmp
复制代码
 
  1. b'c640fc761edbd22f431efb861bc0e28a'
复制代码
 
  1. b'12345678123456781234567812345678'
复制代码
 

图22 调试flag结果
flag{c640fc761edbd22f431efb861bc0e28a}

图23 验证flag结果
  1. def get_new_color(current_color):
  2.   colors = [0xffe699, 0xffcc33, 0xe6ac00, 0xb38600]
  3.   if current_color == 0xFFFFFF:
  4.     return colors[0]
  5.   if current_color in colors:
  6.     pos = colors.index(current_color)
  7.     if pos == len(colors)-1:
  8.       return colors[pos]
  9.     else:
  10.       return colors[pos+1]
  11.   return 0xFFFFFF
  12. addr = ida_dbg.get_ip_val()
  13. while addr < 0xB2ED241F:
  14.   event = wait_for_next_event(WFNE_ANY, -1)
  15.   t = step_over()
  16.   addr = ida_dbg.get_ip_val()
  17.   current_color = get_color(addr, CIC_ITEM)
  18.   new_color = get_new_color(current_color)
  19.   set_color(addr, CIC_ITEM, new_color)
复制代码
#https://www.cnblogs.com/blacksunny/p/7300271.html参考trace 修改的step over
有待改进的地方

本文涉及的命令
  1. adb connect 127.0.0.1:7555
  2. adb install test.apk
  3. ./adb shell am start -D -n com.example.dynamic/.MainActivity
  4. ./adb push android_x86_server /data/local/tmp
  5. ./adb.exe forward tcp:23946 tcp:23946
  6. ./adb forward tcp:8700 jdwp:1535
  7. jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
复制代码
更多靶场实验练习、网安学习资料,请点击这里>>
  1.  
复制代码
 
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4