这个题目充满着西电比赛的风格,那就是出其不意攻其不备。
之前的工作很简单就不说了,发现了那个图片里面隐藏的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 "\nstrings匹配"
i=0
while i<len(s)-2:
if s[i] == "\x00":
if s[i+1]!="\x00":
i+=2
relen=convert_int(s[i-1])
try:
if s[i+relen]=="\x00":
try:
print s[i:i+relen].decode("utf-8")
except:
continue
if s[i+relen*2]=="\x00":
try:
print s[i:i+relen*2].decode("utf-8")
except:
continue
except:
continue
i+=1