美文网首页
jarvisOJ - 逆向wp

jarvisOJ - 逆向wp

作者: fantasy_learner | 来源:发表于2018-12-24 11:48 被阅读0次

    androidReverse

    android killer 反编译后,用ak自带的查看源码,报错缺少对应的java代码文件。使用 dextojar 反编译处对应的Java代码即可查看。

    关键处理(将输入的每个字符 异或 0x17)和 最后的对比结果 (byte[])

    bytes = [113, 123, 118, 112, 108, 94, 99, 72, 38, 68, 72, 87, 89, 72, 36, 118, 100, 78, 72, 87, 121, 83, 101, 39, 62, 94, 62, 38, 107, 115, 106]
    for byte in bytes:
        print(chr(byte ^ 0x17) , end ="")
    

    classical CrackME

    • 1.exeinfope 的结果显示 CrackMe.exe 是一个.NET executable 程序 ,所以使用 ilspy 打开 , 在第一个类中看到关键逻辑
    • 将 输入 base64 之后与固定字符串比较
    • 解base64 得到 flag

    classical CrackME2

    考点 : 动态调试

    __一开始思路错了,静态调试,认为是被混淆了,结果解混淆之后把aes算法分解开了,今天分析不下去,开始搜wp,知道考点是动态调试,工具dnspy __

    用解混淆后的程序动态调试启动失败,用原程序启动,在button的点击事件处下断点,f8和f7混合使用,来了解控制流。
    单步了解到 获取输入文本内容,检测是否为空,然后对文本内容进行加密
    加密方式: aes加密,key = pctf2016 pctf2016 pctf2016 pctf2016
    模式 ecb
    填充: pkcs7padding

    单步到输入结果和flag对比的时候,调试器截图中 a 为输入结果的密文,b为flag的密文,将b用上面的aes 解密获取到flag PCTF{Dot_Net_UnPack3r_yoo}


    find_key

    • uncompyle6 反编译 pyc 为 py文件 , 目前只测试过反编译 python2.7 文件
    • 根据反编译的结果 (注释掉的部分 ) 进行逆向算法,得出flag
    • 下方的注释部分为 反编译的原代码, 未注释的为逆向计算代码

    import sys
    lookup = [196,153, 149,206, 17,221, 10, 217, 167, 18, 36, 135, 103, 61, 111, 31, 92, 152, 21, 228, 105, 191, 173, 41, 2, 245, 23, 144, 1, 246, 89, 178, 182, 119, 38, 85, 48, 226, 165, 241, 166, 214, 71, 90, 151, 3, 109, 169, 150, 224, 69, 156, 158, 57, 181, 29, 200, 37, 51, 252, 227, 93, 65, 82, 66, 80, 170, 77, 49, 177, 81, 94, 202, 107, 25, 73, 148, 98, 129, 231, 212, 14, 84, 121, 174, 171, 64, 180, 233, 74, 140, 242, 75, 104, 253, 44, 39, 87, 86, 27, 68, 22, 55, 76, 35, 248, 96, 5, 56, 20, 161, 213, 238, 220, 72, 100, 247, 8, 63, 249, 145, 243, 155, 222, 122, 32, 43, 186, 0, 102, 216, 126, 15, 42, 115, 138, 240, 147, 229, 204, 117, 223, 141, 159, 131, 232, 124, 254, 60, 116, 46, 113, 79, 16, 128, 6, 251, 40, 205, 137, 199, 83, 54, 188, 19, 184, 201, 110, 255, 26, 91, 211, 132, 160, 168, 154, 185, 183, 244, 78, 33, 123, 28, 59, 12, 210, 218, 47, 163, 215, 209, 108, 235, 237, 118, 101, 24, 234, 106, 143, 88, 9, 136, 95, 30, 193, 176, 225, 198, 197, 194, 239, 134, 162, 192, 11, 70, 58, 187, 50, 67, 236, 230, 13, 99, 190, 208, 207, 7, 53, 219, 203, 62, 114, 127, 125, 164, 179, 175, 112, 172, 250, 133, 130, 52, 189, 97, 146, 34, 157, 120, 195, 45, 4, 142, 139]
    pwda = [188, 155, 11, 58, 251, 208, 204, 202, 150, 120, 206, 237, 114, 92, 126, 6, 42]
    pwdb = [53, 222, 230, 35, 67, 248, 226, 216, 17, 209, 32, 2, 181, 200, 171, 60, 108]
    # flag = raw_input('Input your Key:').strip()
    # if len(flag) != 17:         #长度 17
    #     print 'Wrong Key!!'
    #     sys.exit(1)
    # flag = flag[::-1]           #逆序
    # for i in range(0, len(flag)):
    #     if ord(flag[i]) + pwda[i] & 255 != lookup[i + pwdb[i]]:
    #         print 'Wrong Key!!'
    #         sys.exit(1)
    flag = ""
    for i in range(17):
        flag += str(chr(lookup[i + pwdb[i]] - pwda[i] & 255))
    print(flag[::-1])
    # print 'Congratulations!!'
    # okay decompiling findkey.pyc
    
    

    smail

    • info :本题 主要是熟悉下smail ,smail 理解后 是一个 base64 的 aes 加密 ecb 模式

    自己简单翻译的 smailToJava

    int constructor(){
        this.str2 = "cGhyYWNrICBjdGYgMjAxNg==";
        this.getflag("sSNnx1UKbYrA1+MOrdtDTA==");
    }
    
    string getflag(string str){
        string v3 = null;
        byte[] v2 = str.getBytes();
        byte[] v0 = Base64.decode(v2 , v3);//v0 : content byte[]
        String v1;
        v2        = this.str2.getBytes();
        v2        = Base64.decode(v2 , v3);
        v1        = new string(v2);        //v1 :  kk String 
        v3        = this.decrypt(v0 , v1);
        print(v3)
    
        return null;
    }
    
    String decrypt(byte[] content , String password){
        stirng v4 = null; // "m"  string
        try{
            byte[] v3 = password.getBytes();// "keyStr"  byte[]
            string v7 = "AES";
                   v2 = new javax/crypto/spec/SecretKeySpec(v3 , v7);//key :key
                   v7 = "AES/ECB/NoPadding";
                   v0 = Cipher.getInstance(v7); //cipher
                   v7 = 0x2;
        Byte[] result = v0.init(v7 , v2).doFinal(content);
                   v5 = new string(result);
                   v4 = v5;
                   return v4;
        }catch{
    
        }
    }
    
    

    解密过程中有点瓜皮, 因为是flag 是 aes加密后再base64的 , 所以逆过程的时候,b64decode 出来的结果带有不可见字符,所以不能在线执行直接拿flag,
    然后 python 的加密库有点瓜皮 ,我就用了php 来解密(解密库 不在标准php中自带 , 所以使用了php在线执行 :)

    <?php
    $privateKey = "phrack  ctf 2016";
    ## 标准php 未开启 mcrpt 使用php在线执行 http://www.dooccn.com/php/
    // $data    = "Test String";
    
    // //加密
    // $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $privateKey, $data, MCRYPT_MODE_CBC, $iv);
    // echo(base64_encode($encrypted));
    // echo '<br/>';
    
    //解密
    $encryptedData = base64_decode("sSNnx1UKbYrA1+MOrdtDTA==");
    $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $privateKey, $encryptedData, MCRYPT_MODE_ECB, '');
    echo($decrypted);#result : PCTF{Sm4liRiver}
    
    ?>
    

    相关文章

      网友评论

          本文标题:jarvisOJ - 逆向wp

          本文链接:https://www.haomeiwen.com/subject/vhgakqtx.html