DASCTF八月挑战赛 Android 逆向 apkrev

admin 2022年10月19日08:04:34评论69 views字数 3543阅读11分48秒阅读模式

DASCTF八月挑战赛 Android 逆向 apkrev

本文为看雪论坛优秀文章
看雪论坛作者ID:逆时针向左


题目链接:https://buuoj.cn/match/matches/28/challenges#apkrev

下载后解压可得一个名为 apkrev 的 apk 文件,扔到模拟器里运行。
DASCTF八月挑战赛 Android 逆向 apkrev
包含一个输入框和一个按钮,随便输入123,Toast 显示 fail。使用 jeb 打开。
DASCTF八月挑战赛 Android 逆向 apkrev
在 MainActivity 上右键反编译。
DASCTF八月挑战赛 Android 逆向 apkrev
可以看到,调用了 so 文件中的检验函数 myCheck(),参数为输入的字符串。

IDA 分析 so 文件


把 so 文件(x86)扔进 IDA,并在函数窗口搜索 myCheck 函数,双击跳转,F5,从返回开始看起:
DASCTF八月挑战赛 Android 逆向 apkrev
返回值 v28 只在 136 行被赋值为 1,其余均为 0;

显然,132 行的 while 循环是在比较输入字符串经过一系列处理后是否与密文 enc 相同。v27 从 0 开始自增,直至大于 0x1F(即 31)时,循环结束。

先查看 enc:
DASCTF八月挑战赛 Android 逆向 apkrev
用脚本将 enc 复制出来。在 IDA 中按快捷键 Shift + F2:
DASCTF八月挑战赛 Android 逆向 apkrev
python 源码:
from idaapi import *bytes_addr = 0x00033004bytes_size = 32data = get_bytes(bytes_addr,bytes_size)L = [hex(ch) for ch in data]print (L)# 真密文# ['0x8c', '0xc4', '0x0', '0xe6', '0x6a', '0x88', '0xb8', '0x90', '0xc2', '0x7', '0x6b', '0xa9', '0xc3', '0xa', '0x3e', '0xc0', '0x44', '0xa6', '0xfe', '0x7e', '0xf0', '0x59', '0x4c', '0x83', '0x3d', '0x2b', '0xe2', '0xd3', '0x38', '0xcb', '0x82', '0x5b']

继续分析代码可以看出,输入字符串长度应为 32,且只在此处进行了异或操作:
DASCTF八月挑战赛 Android 逆向 apkrev
于是考虑动态调试 so 文件,思路参考 [1],调试方法参考 [2] 和 [3]。


思路:输入错误的 flag,得到假密文,将错误的 flag 、假密文、真密文进行异或,即可得到真 flag。


动态调试


1、使用雷电模拟器,首先确定模拟器的安卓版本,安装 device info hw.apk ( https://www.cr173.com/soft/845060.html )查看相关信息: DASCTF八月挑战赛 Android 逆向 apkrev
平台为 android_x86,所以选择 IDA/dbgsrv 目录下的 android_x86_server 文件,使用 adb push 命令传输到模拟器,在添加可执行权限后运行。

2、新建 cmd 窗口,命令如下:
D:IDA ProIDA Pro 7.5dbgsrv>adb push android_x86_serveradb.exe: push requires an argument D:IDA ProIDA Pro 7.5dbgsrv>adb push android_x86_server /data/local/tmpandroid_x86_server: 1 file pushed, 0 skipped. 30.5 MB/s (1130104 bytes in 0.035s) D:IDA ProIDA Pro 7.5dbgsrv>adb shellaosp:/ # suaosp:/ # cd /data/local/tmpaosp:/data/local/tmp # lltotal 1104-rw-rw-rw- 1 root root 1130104 2020-12-11 22:18 android_x86_serveraosp:/data/local/tmp # chmod 777 android_x86_serveraosp:/data/local/tmp # ./android_x86_serverIDA Android x86 32-bit remote debug server(ST) v7.5.26. Hex-Rays (c) 2004-2020Listening on 0.0.0.0:23946...

3、再建一个 cmd 命令行窗口,使用 forward 程序进行端口转发:
C:Usersadmin>adb forward tcp:23946 tcp:2394623946 C:Usersadmin>adb forward --listemulator-5554 tcp:23946 tcp:23946

4、打开 IDA,选择菜单 Debugger -> Attach -> Remote Linux debugger;
DASCTF八月挑战赛 Android 逆向 apkrev
Hostname 设置为 127.0.0.1,OK;
DASCTF八月挑战赛 Android 逆向 apkrev
选择要附加的进程,找到 com.example.re,OK;

进入调试界面后,在右侧 Modules 窗口搜索需要调试的库:libnative-test.so;
DASCTF八月挑战赛 Android 逆向 apkrev
双击,跳转到对应的 so 库,即可看到 so 库里的方法,搜索方法:myCheck();
DASCTF八月挑战赛 Android 逆向 apkrev
双击函数名,跳转到对应的函数代码,F5,与静态分析看到的 myCheck 方法相同;

在比较处下断:
DASCTF八月挑战赛 Android 逆向 apkrev

5、开始调试:

注意,要求输入字符串长度为 32,因此输入:flag{11111111111111111111111111};
DASCTF八月挑战赛 Android 逆向 apkrev
程序在断点处停下,先查看 enc:
DASCTF八月挑战赛 Android 逆向 apkrev
再查看 v38(在栈上):
DASCTF八月挑战赛 Android 逆向 apkrev
通过 python 脚本复制:
from idaapi import *bytes_addr = 0xCFFFD6F8bytes_size = 32data = get_bytes(bytes_addr,bytes_size)L = [hex(ch) for ch in data]print (L)# 假密文#['0xdd', '0x9f', '0x58', '0xb3', '0x72', '0x80', '0xef', '0x96', '0xc1', '0x2', '0x3b', '0xfe', '0x97', '0xc', '0x39', '0x94', '0x43', '0xaf', '0xac', '0x78', '0xf8', '0x59', '0x4c', '0x84', '0x68', '0x2a', '0xe4', '0x86', '0x68', '0x9c', '0xd2', '0x13']

6、至此,可通过脚本计算出 flag:
enc = [0x8C, 0x0C4, 0x0, 0x0E6, 0x6A, 0x88, 0x0B8, 0x90, 0x0C2, 0x7, 0x6B, 0x0A9, 0x0C3, 0x0A, 0x3E, 0x0C0, 0x44, 0x0A6, 0x0FE, 0x7E, 0x0F0, 0x59, 0x4C, 0x83, 0x3D, 0x2B, 0x0E2, 0x0D3, 0x38, 0x0CB, 0x82, 0x5B] fake_flag = "flag{11111111111111111111111111}" fake_flag_cipher = [0xdd, 0x9f, 0x58, 0xb3, 0x72, 0x80, 0xef, 0x96, 0xc1, 0x2, 0x3b, 0xfe, 0x97, 0xc, 0x39, 0x94, 0x43, 0xaf, 0xac, 0x78, 0xf8, 0x59, 0x4c, 0x84, 0x68, 0x2a, 0xe4, 0x86, 0x68, 0x9c, 0xd2, 0x13] for i in range(32):    print(chr(ord(fake_flag[i])^fake_flag_cipher[i]^enc[i]), end='')# 7792c9f724afe76e68c79116d07dafa5

7、提交验证:
DASCTF八月挑战赛 Android 逆向 apkrev
over!
 

参考:

1、[原创]DASCTF八月挑战赛 re :

https://bbs.pediy.com/thread-269129.htm

2、安卓逆向_17 --- IDA 动态调试:

https://blog.csdn.net/freeking101/article/details/106701908

3、IDA远程调试Android中so文件:

https://www.cnblogs.com/ddms/p/8820044.html



DASCTF八月挑战赛 Android 逆向 apkrev 


看雪ID:逆时针向左

https://bbs.pediy.com/user-home-781904.htm

*本文由看雪论坛 逆时针向左 原创,转载请注明来自看雪社区



DASCTF八月挑战赛 Android 逆向 apkrev

官网:https://www.bagevent.com/event/6334937


DASCTF八月挑战赛 Android 逆向 apkrev


# 往期推荐

1.All About Crypto - CTF竞赛密码学方向指南

2. ghostscript 命令注入漏洞分析

3.16位实模式切换32位保护模式过程详解

4. 高Glibc版本下的堆骚操作解析

5.新人PWN堆Heap总结off-by-null专场

6. CVE-2012-3569 VMware OVF Tool格式化字符串漏洞分析



DASCTF八月挑战赛 Android 逆向 apkrev
公众号ID:ikanxue
官方微博:看雪安全
商务合作:[email protected]



DASCTF八月挑战赛 Android 逆向 apkrev

球分享

DASCTF八月挑战赛 Android 逆向 apkrev

球点赞

DASCTF八月挑战赛 Android 逆向 apkrev

球在看



DASCTF八月挑战赛 Android 逆向 apkrev

点击“阅读原文”,了解更多!

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年10月19日08:04:34
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   DASCTF八月挑战赛 Android 逆向 apkrevhttp://cn-sec.com/archives/557530.html

发表评论

匿名网友 填写信息