re学习笔记(97)攻防世界 mobile进阶区 APK逆向-2 AndroidManifest.xml修复

推荐肉丝r0ysue课程(包含安卓逆向与js逆向):

题目描述:提交那一串XXXXXXXXXXXXXX即可。

下载下来安装后报错

Performing Streamed Install
adb: failed to install ap.apk: Failure [INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION: Failed to parse /data/app/vmdl1255401458.tmp/base.apk: Corrupt XML binary file]

同时使用apktool反编译也报错

java -jar C:\Users\user\.apklab\apktool_2.6.0.jar d c:\Users\user\Desktop\ap.apk -o c:\Users\user\Desktop\ap --only-main-classes
I: Using Apktool 2.6.0 on ap.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources...
Exception in thread "main"
brut.androlib.err.RawXmlEncounteredException: Could not decode XML
at brut.androlib.res.decoder.XmlPullStreamDecoder.decode(XmlPullStreamDecoder.java:145)
    at brut.androlib.res.decoder.XmlPullStreamDecoder.decodeManifest(XmlPullStreamDecoder.java:151)
at brut.androlib.res.decoder.ResFileDecoder.decodeManifest(ResFileDecoder.java:159)
    at brut.androlib.res.AndrolibResources.decodeManifestWithResources(AndrolibResources.java:193)
    at brut.androlib.Androlib.decodeManifestWithResources(Androlib.java:140)
    at brut.androlib.ApkDecoder.decode(ApkDecoder.java:109)
    at brut.apktool.Main.cmdDecode(Main.java:175)
    at brut.apktool.Main.main(Main.java:78)
Caused by: java.io.IOException: Expected: 0x001c0001, got: 0x01001c00
at brut.util.ExtDataInput.skipCheckChunkTypeInt(ExtDataInput.java:72)
    at brut.androlib.res.decoder.StringBlock.read(StringBlock.java:50)
    at brut.androlib.res.decoder.AXmlResourceParser.doNext(AXmlResourceParser.java:814)
    at brut.androlib.res.decoder.AXmlResourceParser.next(AXmlResourceParser.java:98)
    at brut.androlib.res.decoder.AXmlResourceParser.nextToken(AXmlResourceParser.java:108)
    at org.xmlpull.v1.wrapper.classic.XmlPullParserDelegate.nextToken(XmlPullParserDelegate.java:105)
    at brut.androlib.res.decoder.XmlPullStreamDecoder.decode(XmlPullStreamDecoder.java:138)
    ... 7 more
Decoding process exited with code 1

jeb、jadx、gda均不能反编译AndroidManifest.xml文件;但其他文件可以正常解析。粗略看了一下代码,大概是获取全部联系人然后发条短信什么的。然后从自身assets目录释放一个apk再加载,可那个apk已经被替换成了lnk,被杀毒软件删了,所以我觉得重点还是在这个解析出错的AndroidManifest.xml文件中,重新回来研究报错。

报错信息为

Caused by: java.io.IOException: Expected: 0x001c0001, got: 0x01001c00

进行搜索
re学习笔记(97)攻防世界 mobile进阶区 APK逆向-2 AndroidManifest.xml修复_第1张图片
而这个值,根据四哥的文章Android逆向之旅—解析编译之后的AndroidManifest文件格式
应为固定值0x001c0001
010修改,压缩然后重新打包进行反编译
在这里插入图片描述
此时报错变成了

Exception in thread “main” brut.androlib.err.RawXmlEncounteredException: Could not decode XML
at brut.androlib.res.decoder.XmlPullStreamDecoder.decode(XmlPullStreamDecoder.java:145)
at brut.androlib.res.decoder.XmlPullStreamDecoder.decodeManifest(XmlPullStreamDecoder.java:151)
at brut.androlib.res.decoder.ResFileDecoder.decodeManifest(ResFileDecoder.java:159)
at brut.androlib.res.AndrolibResources.decodeManifestWithResources(AndrolibResources.java:193)
at brut.androlib.Androlib.decodeManifestWithResources(Androlib.java:140)
at brut.androlib.ApkDecoder.decode(ApkDecoder.java:109)
at brut.apktool.Main.cmdDecode(Main.java:175)
at brut.apktool.Main.main(Main.java:78)
Caused by: java.io.EOFException: reached end of stream after reading 2924 bytes; 65376 bytes expected
at com.google.common.io.ByteStreams.readFully(ByteStreams.java:790)
at com.google.common.io.ByteStreams.readFully(ByteStreams.java:771)
at com.google.common.io.LittleEndianDataInputStream.readFully(LittleEndianDataInputStream.java:65)
at brut.util.DataInputDelegate.readFully(DataInputDelegate.java:66)
at brut.androlib.res.decoder.StringBlock.read(StringBlock.java:70)
at brut.androlib.res.decoder.AXmlResourceParser.doNext(AXmlResourceParser.java:814)
at brut.androlib.res.decoder.AXmlResourceParser.next(AXmlResourceParser.java:98)
at brut.androlib.res.decoder.AXmlResourceParser.nextToken(AXmlResourceParser.java:108)
at org.xmlpull.v1.wrapper.classic.XmlPullParserDelegate.nextToken(XmlPullParserDelegate.java:105)
at brut.androlib.res.decoder.XmlPullStreamDecoder.decode(XmlPullStreamDecoder.java:138)
… 7 more

这里出现了只读取了2924个字节,但是预期是65376字节;可能长度偏移什么被修改了,而下面报错函数名称为StringBlock,说明还是在解析String这里。我找了找,只找到了字符池偏移和样式池偏移相加等于65376
re学习笔记(97)攻防世界 mobile进阶区 APK逆向-2 AndroidManifest.xml修复_第2张图片
而StyleCount的数量为0,没有样式,偏移也应该为0,所以将scStylePoolOffset的值修改为0

此时发现能够成功解压了

λ java -jar C:\Users\user\.apklab\apktool_2.6.0.jar d app.apk
I: Using Apktool 2.6.0 on app.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: C:\Users\Palmer\AppData\Local\apktool\framework\1.apk
I: Regular manifest package...
I: Decoding file-resources...
I: Decoding values */* XMLs...
I: Baksmaling classes.dex...
I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...

联想到题目描述,可见这就是flag
re学习笔记(97)攻防世界 mobile进阶区 APK逆向-2 AndroidManifest.xml修复_第3张图片
则flag为8d6efd232c63b7d2

此时再回来看该文件,可以发现即使不能反编译,由于字符池的偏移什么的都是正确的,可以直接在二进制中看到flag
在这里插入图片描述
做题只是粗略的看了下AndroidManifest.xml的String Chunk内容,有时间一定要好好学习一下,顺带着看一下apktool的源码

你可能感兴趣的:(Android逆向,ctf小白成长ing,#,reverse,安全,逆向,android,CTF,Android逆向)