171102 逆向-EISCTF(Mobile)

本文记录了解决FlagApp安全挑战的过程,包括处理签名问题、解决DEX的MagicNumber错误、使用Winrar提取dex和lib文件并进行反编译,最终通过逆向工程解决了native方法的谜题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1625-5 王子昂 总结《2017年11月2日》 【连续第398天总结】
A. EISCTF-Mobile
B.

FlagApp

直接安装发现报错,直接拖入APK改之理也反编译失败
刚开始以为是签名问题,查了一堆,学会了用keytool生成密钥库,然后用jarsigner签上了名
仍然报错OTZ
仔细检查了一下发现APK改之理里提示了DEX的MagicNumber错误
搜索了一下APK的十六进制数据,也没有找到对应的MagicNumber
于是用Winrar打开,解压出dex和lib文件
它们倒是没问题,可以直接通过dex2jar和IDA来反编译得到源码
大概看了一下
程序获取输入内容,然后通过check方法校验
而check方法是native的,源码在so库中,于是继续反编译:
这里写图片描述
这个是ARM架构的so库,代码为dalvik汇编
不过IDA反编译出来还好,大体上就是一个运算后与数组校验的过程
dump下来逆运算就可以了

d = [150, 84, 20, 63, 86, 46, 111, 117, 36, 70, 76, 43, 90, 151, 32, 133, 205, 64, 180, 56, 78, 44, 90, 119, 119, 44]
f = [62, 125, 126, 80, 126, 227, 227, 59, 34, 96, 196, 192, 20, 63, 70, 75, 97, 14, 210, 148, 165, 132, 118, 17, 88, 131]
s = "123456"
flag = ""
# print(len(d))
# print(len(f))
# 正向
for i in range(len(s)):
    p = d[i]^((ord(s[i])>>3)|((ord(s[i])<<5)&0xff))
    # print(hex(p))

# 逆向
for i in range(26):
    p = f[i] ^ d[i]
    flag += chr((p>>5)|((p<<3)&0xff))
print(flag)

值得一提的是我刚开始处理的是x86架构的so库,得到的是intel汇编,反编译出来也差不多,结构和库函数稍有区别,不过个人理解有点困难,所以想动态附加一下试试

基本过程之前也提过,先adb push IDA目录下的android_server,然后adb shell运行,然后进行forward tcp端口转发,接着就可以IDA附加了
IDA选择attach to process时报错debugger id is 11, excepted 1(linux)
百度也没看到有相关的问题,于是在这里提一下
x86架构的so反编译时,IDA的debugger只会提供与pe/elf相同的选择,例如remote linux、remote gdb等
而arm架构的so反编译时,IDA才会提供arm/android的debugger
报那个错的原因就是debugger选择错误,我当时斟酌了一下选择了remote linux,想连接android_server当然会错误

另外,由于IDA给的android_server是ARM架构的,因此IDA不可能附加到x86架构上的模拟器或是so库上。目前我还没找到有人提供x86架构的android_server╮(╯_╰)╭所以IDA动态调试只能通过真机了

C. 明日计划
pwnable.kr练习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值