XDCTF2014 CRACK150&关于dex的一些看法

这个题目充满着西电比赛的风格,那就是出其不意攻其不备。

之前的工作很简单就不说了,发现了那个图片里面隐藏的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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值