zoukankan      html  css  js  c++  java
  • REVERSE-极客大挑战-geek2.apk

    嗯 一道apk的题目,题目本身并不是很难,但是我用的python却坑了我小半天。。。不过在纠错的过程中我也学到了不少东西

    链接:http://pan.baidu.com/s/1i5LkJDr  密码:46d8

    拿到apk程序,在模拟器中模拟一下,如下:

    要求输入username和password进行注册

    再用jeb软件进行反编译,程序分析过程就不细说了,加密流程是mainactivity->handler->encrpty1->encrypty2 依次对username进行加密,将结果字符串倒置即得到key,将key和username分别作为秘钥和明文进行AES加密,得到的结果进行base64编码,得到的结果应该就是password,输入的password正确的话,就注册成功

    于是我就照着思路用python写好了注册机,但是结果报错,

    于是我就进行了检查,

    注意到源程序里有如下代码:

      Log.v("MainActivity", "AES Key is : " + v2.getNameCalc());
                new AESEncrpty();
                try {
                    String v3 = AESEncrpty.Encrypt(v2.getName(), v2.getNameCalc());
                    Log.v("MainActivity", v3);
                    String v4 = v2.getPass();
                    Log.v("MainActivity", v4);

    log.v实际上是将结果输出到log文件中,但是在模拟器或者真机上是看不到的,

    于是我用到了adb这样一个很神奇的调试器,应用环境:windows平台  模拟器:腾讯手游助手。。。

    安装好adb后,最好将adb.exe的路径添加到环境变量中,

    打开模拟器,运行程序

    打开命令提示符,输入adb devices命令,可以看到如图:

    emulator-5554 表示检测到了该模拟器,device表示adb已与该模拟器连接

    接着输入adb logcat  查看log文件,接着在模拟器中输入字符后,可以看到,输出的正确的AES key和正确的输出结果,

    如下图,我输入的name是:1231231231231231 password是:thisisthepasswordisubmit,log结果如下:

    第二个输出是正确的password

    而我的是:

     
    就差后面那一堆,应该不是base64的问题,查了下发现是PKCS5Padding的问题,由于apk程序中是
       SecretKeySpec v3 = new SecretKeySpec(sKey.getBytes("utf-8"), "AES");
                Cipher v0 = Cipher.getInstance("AES/ECB/PKCS5Padding");
                v0.init(1, ((Key)v3));
                v4 = Base64.encodeToString(v0.doFinal(sSrc.getBytes("utf-8")), 2);

    故要在python中声明pad模式,添加后,脚本就正确了,如下:

    #coding=utf-8
    from Crypto.Cipher import AES
    import base64
    
    str="ThisIsNotFL@GplzDonnotSubmitThisString#HaveFunWithGeekmastergogo"
    str2="talkischeapshowmethecode$ischeapshowmethe#SycSYC{IamNotFLAG2333}"
    xorstring="o0xmuhe"
    
    username=raw_input("please input the username, its length must be 16:")
    
    v11=''
    for v5 in range(len(username)):
        v11+=chr(ord(username[v5])+3)
    
    v8=''
    for v6 in range(len(v11)):
        v8+=str[ord(v11[v6])%len(str)]
    
    v2=''
    for v0 in range(len(v8)):
        v2+=chr(ord(v8[v0])^ord(xorstring[v0%7]))
    
    v3=''
    for v1 in range(len(v8)):
        v3+=str2[(ord(v2[v1])+7)%len(str2)]
    
    getnamecalc=v3[::-1]
    
    print "the AES key is:",getnamecalc
    
    mode=AES.MODE_ECB
    BS = AES.block_size
    pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS)
    encryptor=AES.new(getnamecalc,mode)
    ciphertext=encryptor.encrypt(pad(username))
    
    out=base64.b64encode(ciphertext)
    
    print "the password should be:",out
  • 相关阅读:
    jQ的工具类方法
    jq-ajax
    jq-ajax-get
    LOAD
    JQ的尺寸类
    JQ-DOM与元素的操作
    jQ-DOM属性的操作
    jQ的事件
    3位创业公司CEO亲述:200人的小公司,这么做数据管理就对了
    十二潜意识的智商
  • 原文地址:https://www.cnblogs.com/lomooo/p/5971206.html
Copyright © 2011-2022 走看看