XDCTF2014 CRACK150&关于dex的一些看法

2019-04-14 15:57发布

这个题目充满着西电比赛的风格,那就是出其不意攻其不备。 之前的工作很简单就不说了,发现了那个图片里面隐藏的dex,那是成功了一大步了。 不过觉得这道题目很难的人呢,自会想办法去修补这个残破不堪的dex文件,以致于浪费了大量的时间在这个上面。 根据dex文件的构造,和头信息里面的默认数值,文件头长度,009版本=0x5C,035版本=0x70,标识字节顺序的常量,根据这个常量可以判断文件是否交换了字节顺序,缺省情况下=0x78563412,连接段的大小,如果为0就表示是静态连接,连接段的开始位置,从本文件头开始算起。如果连接段的大小为0,这里也是0,然后0x20替换为0x00,这里就可以修补了。 但是,修补个蓝翔呢=~ date区数据utf-8编码,直接utf-8下就没了=0= 就算你不知道那个string串到底是哪里开始哪里结束=0=
这里科普下=date区的数据,每个string以/x00开始第二个字节代表长度,后接内容。 然后flag就出来了。
这也引发了一些思考,1.这个dex最后也没有修补完,如果真的不是明文,而是算法类才能出flag的,该怎么修复dex呢?2.自动化工具的实现?3.peid能查dex么?
首先利用ubuntu的file测试下损坏的dex: 信息只有一个magic字段的信息。 PEid当然是不行的。 我的是ida6.1 理所当然是会报错。
头信息损坏,数据区错位,这里除了结构匹配外,没有更好的办法。 或者就是根据经验,来修复头。但是这种繁琐的工作一般来说是交给程序来完成的。 利用这两天时间我做了一个修复头的小工具,不过尚未完善就不放出。 先发送个匹配date区数据结构的模块,其实从原理上来说并没有大用,不过聊胜于无。
__author__ = 'BlackCat' # -*- coding:utf-8 -*- read=open("kd.dex","rb") s=read.read() def convert_int(s): rs=s[::-1] r=0 for i in rs: r=(r<<8)|(ord(i)) return r print " strings匹配" i=0 while i